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