WIFSTOPPED无法正常工作

时间:2015-09-16 05:14:31

标签: 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正在中断并且进程在后台进行。我试图在网上搜索但找不到任何有用的东西。

1 个答案:

答案 0 :(得分:1)

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

检查以确保它们设置为相同的PID,尽管它可能更安全,更易读:

kill(pid,SIGCONT);

进入监控循环之前。

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