C 如何正确地向子进程发送SIGTSTP信号?

C 如何正确地向子进程发送SIGTSTP信号?,c,process,signals,C,Process,Signals,我正在为一个赋值编写一个自定义shell程序,其中我执行fork()和exec()。我要做的是处理信号SIGTSPS,以便它挂起子进程 我目前正在处理crtl z void SIGTSTP_Handler(){ if (child != 0) { kill(child, SIGTSTP); } } 和我的父母一起等待 if (waitpid(child, &status, WUNTRACED |WCONTINUED ) == -1) { err(-1

我正在为一个赋值编写一个自定义shell程序,其中我执行fork()和exec()。我要做的是处理信号SIGTSPS,以便它挂起子进程

我目前正在处理crtl z

 void SIGTSTP_Handler(){

if (child != 0) {
    kill(child, SIGTSTP);
    }
}
和我的父母一起等待

if (waitpid(child, &status, WUNTRACED |WCONTINUED ) == -1) {
        err(-1, "Failed to waitpid()");
    }
if(WIFSTOPPED(status))
{

    printf("child stop with code: %d\n", WIFSTOPPED(status));
}
当我按下ctrl Z键时,我的进程停止,但它以代码1退出。这意味着错误。我希望能够暂停子进程,并在传递CONT信号时恢复它。如何正确地处理ctrl Z,使其挂起子进程,如果输入fg,它将使挂起进程重新运行

sleep 10
PID 71740: I must be the parent!
^Z
71740child stop with code: 1

您的子进程已停止,而不是退出。如果它已退出,WIFSTOPPED(状态)将为0,WIFEXITED(状态)将为非零

要继续此过程,当执行
fg
命令时,向子级发送
SIGCONT
信号:


kill(child,SIGCONT)

hmm当发送子进程SIGSTSP时,我是否应该在调用终端上的作业时看到它?或者,如果我还没有为fg实现一个信号处理程序,它是否应该将我挂起的孩子带到fg中?我不确定我是否理解第一个问题——您是否实现了自己的shell,大概是使用它自己的
作业
命令吗?至于第二个问题,您不需要为
SIGCONT
实现一个信号处理程序。子进程在收到一个后将自动恢复执行。下载
strace
的源代码,因为它会执行类似的操作。