子コマンドを実行するプログラムを作成しようとしていますが、Ctrl+Cでその子を強制終了することはできません。
setpgid/setpgrpでこれを達成できることを読みました。
次のコードはOSXで動作しますが、Linux(2.6.32、Ubuntu 10.04)では次のように実行されます。
./a.out ls
出力は発生せず、プログラムをSIGINTで強制終了することはできません。
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
int main(int argc, char **argv) {
if (argc < 2) {
printf("Please provide a command\n");
exit(1);
}
int child_pid = vfork();
if (child_pid == 0) {
if (setpgrp() == -1) {
perror("setpgrp error");
exit(1);
}
printf("Now executing the command:\n");
argv++;
if (execvp(argv[0], argv) == -1) {
perror("Could not execute the command");
exit(1);
}
}
int child_status;
wait(&child_status);
}
setpgrpの呼び出しをコメントアウトすると、残りのコードが機能していることがわかります。