Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Wifstop工作不正常_C_Linux_Signals - Fatal编程技术网

C Wifstop工作不正常

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

我试图在我的迷你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(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。成功了。谢谢