微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在为我执行 fork() 和 exec() 的任务编写自定义 shell 程序。我想要做的是处理信号 SIGTSPS 以便它挂起子进程。

我目前正在处理 crtl z

 void SIGTSTP_Handler(){

if (child != 0) {
    kill(child,SIGTSTP);
    }
}

和我的父进程 waitpid

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(status) 将为 0,WIFEXITED(status) 将为非零。

要继续该过程,请在执行 fg 命令时向子进程发送 SIGCONT 信号:

kill(child,SIGCONT)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。