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()関数の実装