2009-07-06 28 views
3

我們用C語言編寫的一對夫婦的各種UNIX平臺(這個問題是在SunOS 5.10發生的)一個小型的守護進程應用程序,基本上只是打開了一個串行端口,然後偵聽信息通過進來說港口。申請人在收到神祕SIGINTs

在這種特定情況下,後臺程序似乎讀取單個傳輸(如數據的文件的價值)通過串行端口發送過來,然後將其接收信號情報。每次都發生這種情況。其他客戶在沒有收到SIGINT的情況下非常類似地使用此設置。很明顯,用戶不是按Ctrl-C。我們有一個相對簡單的信號處理程序,所以我們肯定知道這是發生了什麼。

別的什麼可能會導致這?在這裏搜索並查看這些問題,我找不到可能導致SIGINT的其他事情的很多解釋。我還查看了代碼,發現沒有調用raise(),只有一個調用kill(pid,0),它不會發送SIGINT。

任何想法或見解肯定會理解的。

+0

調試不顯示任何提示?什麼告訴你gdb? – 2009-07-06 19:06:50

+0

現場沒有調試過,因爲這不是一件小事。 – Morinar 2009-07-06 19:19:19

回答

2

如果您不希望串行端口成爲進程的控制終端,請使用open標誌O_NOCTTY將其打開。如果是控制終端,則來自串行端口的數據可能會被解釋爲中斷或其他特殊字符。

0

我發現一個有趣的blog post大約有類似症狀調試問題。雖然我懷疑這是同一個問題,但它有一些非常有用的調試技巧來跟蹤信號的來源。

+0

這看起來非常有趣,實際上類似於我所經歷的。我做了一個由博客文章推薦的更改,目前正在進行測試。 – Morinar 2009-07-06 22:48:36

1

你沒有說你的信號處理程序如何連接,但如果你能使用sigaction(2)從而得到一個siginfo_t附加它,然後它看起來像這將包括髮送信號(si_pid)的PID。

+0

糟糕,該鏈接是一個Linux手冊頁。 SunOS 5.10的副本位於http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?sigaction+2(沒有列出siginfo_t的成員,但希望si_pid仍然存在) 。 – 2009-07-06 19:47:16