Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从信号处理程序终止子进程_C_Linux_Shell_Unix - Fatal编程技术网

C 从信号处理程序终止子进程

C 从信号处理程序终止子进程,c,linux,shell,unix,C,Linux,Shell,Unix,我正在编写一个简单的shell,我必须使用execv为子进程派生一个外部程序。我必须将信号TSTPCntl+Z发送给信号处理程序,然后杀死当前正在运行的子进程。我的问题是找不到将子pid传递到信号处理程序的方法。如果在处理程序中执行getpid,它只返回父pid。我还尝试在子进程中将子pid设置为getpid,并将该变量设置为全局变量,但这也不起作用。这是我到目前为止的一些代码 void handler(int); //in main if (!built_in_cmd(myArgc,myArg

我正在编写一个简单的shell,我必须使用execv为子进程派生一个外部程序。我必须将信号TSTPCntl+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);
} 

信号本质上是异步的,除了通过全局变量外,没有任何方法向它们传递任何额外的状态。假设您只有一个线程在等待子线程,使用全局线程是安全的,但在其他情况下,没有多线程安全的方法:

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

信号本质上是异步的,除了通过全局变量外,没有任何方法向它们传递任何额外的状态。假设您只有一个线程在等待子线程,使用全局线程是安全的,但在其他情况下,没有多线程安全的方法:

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

fork返回子PID。将其放入全局变量中,并在signal handler.BTW中使用该变量,您的行Parent:My child has bes sprowned由子级打印,而不是它声称的父级。fork返回子PID。把它放在一个全局变量中,并在信号处理程序中使用它。顺便说一句,您的行Parent:My child has sprowned是由子级打印的,而不是它声称的父级。不完全正确的是,您不能向信号处理程序传递额外的状态。当然,使用全局变量是最简单的事情,但是您可以将pid和任何任意数据写入管道并在信号处理程序中读取。不完全正确的是,您不能向信号处理程序传递额外的状态。当然,使用全局变量是最简单的事情,但是您可以将pid和任何任意数据写入管道并在信号处理程序中读取。