簡體   English   中英

從信號處理程序中殺死子進程

[英]Killing a child process from a signal handler

我正在編寫一個簡單的shell,我必須使用execv為子進程分叉一個外部程序。 我必須將信號TSTP(Cntl + Z)發送到信號處理程序,然后終止當前正在運行的子進程。 我的問題是我找不到將Child 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);
} 

信號本質上是異步的,除了通過全局變量之外,沒有辦法將任何額外的狀態傳遞給它們。 假設你只有一個線程在等待一個孩子,那么使用全局是安全的,但是否則沒有多線程安全的方法:

// 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;
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM