c - WIFSTOPPED 无法正常工作

标签 c linux signals

我正在尝试在我的迷你 shell 中执行 fg 命令。 问题如下:

  • 进程 (gedit) 在前台启动。
  • 我使用 ctrl+z 停止并通过检查 WIFSTOPPED(status) 的返回值检查退出我的等待循环:
while(1){
    pid_t pid_check = waitpid(pid,&signal,WNOHANG|WUNTRACED);
    if(pid_check == pid){
        if(WIFSTOPPED(signal)){
            tempid = pid_check;
            break;
        }
        else if(WIFEXITED(signal))
            break;
        else if(WIFSIGNALED(signal))
            break;
    }
    …
}

我希望在给出 fg 命令时恢复:

kill(tempid,SIGCONT);
while(1){
    pid_t pid_check = waitpid(pid,&signal,WNOHANG|WUNTRACED);
    if(pid_check == pid){
        if(WIFSTOPPED(signal)){
            tempid = pid_check;
            printf("Here");
            break;
        }
        else if(WIFEXITED(signal))
            break;
        else if(WIFSIGNALED(signal))
            break;
    }
}

但是 WIFSTOPPED 一直返回非零值,所以 waitpid 中断并且进程进入后台。我试图在线搜索,但找不到任何有用的东西。

最佳答案

我注意到的一件事是您将继续信号发送到 tempid,然后监控 pid

检查以确保将它们设置为相同的 PID,尽管仅使用它可能更安全且更具可读性:

kill(pid,SIGCONT);

在进入监控循环之前。

您可能还需要考虑重命名您的 signal 变量以避免与 signal() 函数发生冲突。

关于c - WIFSTOPPED 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32600269/

相关文章:

c - 将 c 中的调试消息写入文件?

linux - NASM 除法使用变量而不是实际值

linux 不检测死的 tcp 连接

r - 安装软件包 R (Ubuntu)

c++ - 如何将 SIGFPE 与信号一起使用?

c - C 中的 printf 错误

c - 使用 termios() 替换 EOF?

c - 如何确定3个整数中的最大和最小

c - Linux (CentOS) C 中的信号处理

python - PyQT5 中的信号/槽不起作用,因为数组对于函数不可见