应用程序接收神秘SIGINT信号

3
我们有一个小型的守护进程应用程序,使用C语言编写,适用于各种UNIX平台(此问题发生在SunOS 5.10上),基本上只是打开串口,然后通过该端口监听信息。
在这个特定的实例中,守护进程似乎会读取一次传输(例如文件大小的数据)通过串口发送过来,然后接收到SIGINT。每次都会发生这种情况。其他客户也使用类似的设置,但不会收到SIGINT信号。很明显,用户没有按下Ctrl-C键。我们已经安装了相对简单的信号处理程序,所以我们确切地知道这就是发生的事情。
还有什么可能导致这种情况?在Google和这里的问题中寻找,我找不到其他可能导致SIGINT信号的解释。我还查看了代码,并没有调用raise()函数,只有一次调用kill(pid, 0),但这也不会发送SIGINT信号。
任何想法或见解都将不胜感激。

调试没有显示任何提示?gdb 告诉你什么? - Eliseo Ocampos
由于这是一项不容易的任务,我尚未在现场调试过这个问题。 - Morinar
3个回答

2
如果你不想让串口成为进程的控制终端,使用 open 标志 O_NOCTTY 打开它。如果它是控制终端,则来自串口的数据可能会被解释为中断或其他特殊字符。

1
我会接受这个答案,因为它是三个答案中最有帮助的,但事实上更有趣一些。基本上,在串行端口上标记传输完成时,会发送ETX(ascii字符3)。结果发现,该字符也可以作为SIGINT字符。Solaris机器看到该字符,将其评估为信号,然后将信号传递给进程。解决方案就像添加ISIG c_lflag并使用ioctl()设置一样简单。我也设置了O_NOCTTY,因为它本来就应该是这样的。 - Morinar
顺便说一句:ISIG标志基本上只是关闭串口上的信号处理...如果像我一样使用RAW模式读取数据,这基本上是必须的。 - Morinar
未来有类似问题的任何人都可以参考这个好的参考资料:http://www.easysw.com/~mike/serial/serial.html - Morinar

1
你没有说你的信号处理程序是如何附加的,但如果你能够使用 sigaction(2) 附加它以获取 siginfo_t ,那么看起来它将包括发送信号的进程 ID (si_pid)。

哎呀,那个链接是一个Linux man页面。SunOS 5.10的副本位于http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?sigaction+2(该页面没有列出siginfo_t的成员,但希望si_pid仍然存在)。 - Chris Boyle
它被附加到signal()上,我没有读到这是“不受欢迎的”。如果我没有取得任何进展,我将尝试切换到sigaction()。 - Morinar
糟糕,之前的评论应该写成“我读过的是‘不受欢迎’”。无论如何,看了一下手册,似乎si_pid在SIGINT中没有被设置。所有信号只设置前三个字段,其余的是一个联合体,似乎只在特定情况下设置。不过想法很好。 - Morinar

0

我发现了一篇有趣的博客文章,它讲述了如何调试类似症状的问题。虽然我怀疑这不是同一个问题,但它提供了一些非常有用的调试技巧,可以追踪信号的来源。


这看起来非常有趣,实际上与我正在经历的有些相似。我已经根据博客文章中的建议进行了一次更改,并目前正在进行测试的过程中。 - Morinar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接