0

子コマンドを実行するプログラムを作成しようとしていますが、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の呼び出しをコメントアウトすると、残りのコードが機能していることがわかります。

4

1 に答える 1

1

両方のプラットフォームで動作するようにするには、コードのこのセクションを変更する必要がありました。これは、カーネルがセッションとプロセス グループを処理する方法の違いに過ぎないと思います。

if (setsid() == -1) {
   #ifdef LINUX
   perror("setsid error");
   exit(1);
   #else
   if (setpgrp() == -1) {
       perror("setpgrp error");
       exit(1);
   }   
   #endif
}   
于 2013-03-06T06:03:17.047 に答える