Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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 在fgets()循环中实现SIGINT处理程序_C_Linux_Signals - Fatal编程技术网

C 在fgets()循环中实现SIGINT处理程序

C 在fgets()循环中实现SIGINT处理程序,c,linux,signals,C,Linux,Signals,我在的第一章中,使用sigaction()而不是signal()(和)作为提示而不是%)实现了图1.10中的程序 此外,处理程序的printf()中的最后一个)被延迟打印,直到while循环退出 因此,我尝试将对sigaction()的调用替换为对signal()的调用。使用安装了signal()的myorigint,会发生以下情况: $ ./a.out ) ^CInterrupt signal caught <empty line, which I then type RETURN

我在的第一章中,使用
sigaction()
而不是
signal()
(和
作为提示而不是
%
)实现了图1.10中的程序

此外,处理程序的
printf()
中的最后一个
被延迟打印,直到while循环退出

因此,我尝试将对
sigaction()
的调用替换为对
signal()
的调用。使用安装了
signal()
myorigint
,会发生以下情况:

$ ./a.out

) ^CInterrupt signal caught

<empty line, which I then type RETURN while on>

Couldn't execute: : No such file or directory

) ) )
我还尝试在gdb中测试了
sigaction()
signal()
变量,但它们的行为都不同

我的问题是:如何实现一个按照书中的要求运行的
SIGINT
处理程序?也就是说,打印“中断信号捕获”,然后立即打印新的shell提示符

如果有帮助的话,我现在在LinuxMint20上

perror()输出似乎表明SIGINT正在中断 fgets()中的read()


如果正在执行read系统调用,并且出现信号,则read将返回错误,并且errno设置为EINTR。这适用于所有系统调用,或者至少系统调用该块。可以将FGET更改为read并检查read给出的错误。如果read返回-1且errno为EINTR,则可以打印字符串“Interrupt signal capture\n”。

在信号处理程序中使用
printf()
会导致未定义的行为。读取并重试。考虑使用。注意@BasileStarynkevitch谢谢,我会经常查看这些资源,信号处理程序只是设置了一些
volatile sigamatic\u t
标志。研究的启示源代码
$ ./a.out

) ^CInterrupt signal caught

Shell exit error: Interrupted system call

) $
$ ./a.out

) ^CInterrupt signal caught

<empty line, which I then type RETURN while on>

Couldn't execute: : No such file or directory

) ) )
$ ./a.out

) ^C