我正在尝试在我的迷你 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/