プロセスの現在のumask

プロセスの現在のumask

プロセスの現在のumaskを取得できますか?/proc/<pid>/...例えば?

答え1

Linuxカーネル4.7から始める(犯罪)、umaskを使用できます/proc/<pid>/status

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022

答え2

注:この回答はLinuxカーネル4.6以下に適用されます。バラより@egmontの答え最新バージョンのカーネル用。

umaskはprocfsに公開されません。持つ努力する星の成功なしに追加されました。

gdbすでに説明したようにumaskを取得する方法があります。前にここにいましたか?:

$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0

gdbはプロセスとそのスレッドを停止するので、umaskへの一時的な変更は無視できることに注意してください。

これがあなたの場合に適している場合は、次のオネライナーを使用できます。

$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077

実行中のプロセスを制御できる場合のもう1つのオプションは、umaskをファイル、出力などに作成してそこからインポートすることです。

答え3

Linuxでは、systemtap(as root)を使用して次のことができます。

stap -e 'probe kernel.function("do_task_stat") {
           printf("%o\n", $task->fs->umask);
           exit()
         }
         probe begin {system("cat /proc/4321/stat>/dev/null")}'

アクションを実行すると、cat /proc/4321/statこのプローブがトリガーされ、カーネルがそのプロセスのフィールドにdo_task_statアクセスできる場所を調べます。fs->umasktask_struct

関連情報