2

私は単純なシェルを書いていますが、execv を使用して外部プログラムの子プロセスをフォークする必要があります。シグナル TSTP(Cntl+Z) をシグナル ハンドラーに送信し、現在実行中の子プロセスを強制終了する必要があります。私の問題は、子 pid をシグナル ハンドラーに渡す方法が見つからないことです。ハンドラーで getpid() を実行すると、親の pid が返されます。また、子プロセス内で子 pid を getpid() として設定し、その変数をグローバル変数として設定しようとしましたが、それも機能しませんでした。ここに私がこれまでに持っているコードのいくつかがあります。

void handler(int);
//in main
if (!built_in_cmd(myArgc,myArgs)) {
    pid_t pid;
    char *x = myArgs[0];
    if((pid=fork())<0)
        printf("Parent: fork() process failed");
    else {
        if (pid == 0) {
            y=getpid();
            printf("Parent: My child has been spawned. %d %d\n",y,getppid());
            execv(x, myArgs);
            exit(0);
        }
        else {
            signal(SIGTSTP,handler);
            wait(0);
            printf("Parent: My child has terminated.\n");
        }
    }
}
return;

//outside main
void handler(int signo){
    kill(idk,SIGKILL);
} 
4

1 に答える 1

4

シグナルは本質的に非同期であり、グローバル変数を介する以外に、追加の状態をシグナルに渡す方法はありません。子を待っているスレッドが 1 つしかないと仮定すると、グローバルを使用しても安全ですが、それ以外の場合はマルチスレッドセーフな方法はありません。

// At global scope
pid_t child_pid = (pid_t)-1;
...
void myfunc()
{
    pid_t pid;
    if((pid = fork()) < 0)
        ...
    else if(pid == 0)
        ...
    else
    {
        child_pid = pid;
        ...
    }
}
于 2012-11-12T21:42:34.620 に答える