brk(0) が呼び出されるのはなぜですか?

brk(0) が呼び出されるのはなぜですか?

tail最初のシェルは引数なしでコマンドを実行します。

2番目のシェルでは、straceを使用して最初のtailを終了してシステムコールを監視します。

qdii@nomada ~ $ strace kill 1713
execve("/bin/kill", ["kill", "1713"], [/* 82 vars */]) = 0
brk(0)                                  = 0x2533000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9dacfe8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

この命令について知りませんでしたがbrk、調べてみると、プロセスデータセグメントの終わりが変わることがわかりました。なぜkillこのようなことをするのですか?特にデータセグメントを設定することは0ほとんど意味がないようです。

ベストアンサー1

ランタイム・ライブラリー呼び出しは、データ・sbrkセグメントの現在の終わりを読み取ります。ご覧のように、システムコールsbrkの上に実装されて間違ったアドレスで呼び出されると、単に現在の値が返されます。brkbrk

おすすめ記事