system()
TLを見ていたら不思議なコードがありました。
#include <stdlib.h> #include <unistd.h> int main() { system("pkill a.out; sleep 10; ./a.out"); }
いろいろ忘れてて「???」だったのでメモ
- system()は内部でshをfork()→execve()するだけ。
- その際にsystem()は自身の引数を-cオプションでshに渡すので"sh -c pkill a.out; sleep 10; ./a.out"と同じ挙動をさせる
- pkillコマンドでa.outを殺したときには, execve()で起動したshプロセスがinitの子になる(親が死んだときの規定動作)
- このため、initの下で動いているshでさらに./a.outを起動→無限ループ
- "Terminated"と表示されるのはpkillでa.outが殺されたから。
system()がなんか変な事やってるのかなーと思ったら、何もやってなくてワロタ
glibcのソースコード、system()関数の実装