C Wifstop工作不正常
我试图在我的迷你shell中实现C Wifstop工作不正常,c,linux,signals,C,Linux,Signals,我试图在我的迷你shell中实现fg命令。 问题如下: 在前台启动一个进程(gedit) 我使用ctrl+z停止,并通过检查WIFSTOPPED(status)的返回值来检查退出等待循环: while(1){ pid|t pid|检查=等待pid(pid和信号,WNOHANG | WUNTRACED); 如果(pid_检查==pid){ 中频(WIFSTOPED(信号)){ tempid=pid_检查; 打破 } else if(妻子退出(信号)) 打破 else if(WIFSIGNALE
fg
命令。
问题如下:
- 在前台启动一个进程(gedit)
- 我使用ctrl+z停止,并通过检查
的返回值来检查退出等待循环:WIFSTOPPED(status)
while(1){
pid|t pid|检查=等待pid(pid和信号,WNOHANG | WUNTRACED);
如果(pid_检查==pid){
中频(WIFSTOPED(信号)){
tempid=pid_检查;
打破
}
else if(妻子退出(信号))
打破
else if(WIFSIGNALED(信号))
打破
}
…
}
我希望在发出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);
在进入监控回路之前
您可能还想考虑重命名<代码>信号<代码>变量,以避免可能与<代码>信号()/<代码>函数冲突。
您如何声明<代码>信号< /代码>?它通常是
中的函数名。虽然在等待时不必包含
,但您使用了SIGCONT
,这表明您包含了信号头。即使使用了严格的警告(-Wall-Werror-Wextra-Wmissing prototype-Wshadow
),代码编译时是否干净无警告?是的,代码编译时没有任何警告。那么如何声明变量signal
?我假设它一定是int信号代码>-并且您没有使用-Wshadow
进行编译。这样做的目的是在声明变量的函数(块)中隐藏函数信号。这在形式上并不是错误的;这有点离经叛道。该值实际上是一个退出状态-它可以对信号进行编码,也可以对实际退出状态进行编码。我当然不会在任务中使用signal
。请注意,在打印诊断消息时,输出以换行结束是至关重要的(除非您已将stdout
设置为使用setvbuf()
取消缓冲)。因此,请使用printf(“此处\n”)
来确定您的位置(或者,如果您有多个这样的语句,最好是类似于printf(“此处:%d\n”,“行”;
),谢谢!我会遵守的哦!我正在启动tempid并检查pid。我在waitpid()中将pid更改为tempid。成功了。谢谢