2011-04-21 29 views
0

嗨 我有一個信號處理程序定義在一個文件中,從信號生成的地方。我定義了一個「靜態結構sigaction」來定義一個非靜態的信號處理程序。限制一個信號處理程序只捕獲來自它定義的特定文件的信號

我們知道使用「靜態」,我們也可以將範圍限制放到一個單獨的文件中,所以使用這種技術可以限制信號處理器只捕獲定義文件的信號。

我的「文件」 - File1,與其他文件鏈接 - File2,File2可以生成信號,不應該被File1處理程序捕獲。所以我可以實現這一點,如果我把「靜態結構sigaction」在File1中?

enter code here 
File1.c 

static struct sigaction; 
void sigHandler(int sig); // also a handler for SIG_NO but should catch signals generated for only File1.c (sig handler is non-static) 

File2.c 
kill(getpid(), SIG_NO) 

File1.c and File2.c are linked together. 
+1

我們可以有一些代碼來看看嗎? – 2011-04-21 05:38:18

+0

它仍處於設計階段,所以我們沒有代碼。但我可以給一些簡報,將編輯上面,並把它。 – kingsmasher1 2011-04-21 05:39:33

+0

也許你應該嘗試爲SIGINT添加一個處理程序,在該文件的開始處使用'signal(SIGINT,handler)'(應該在函數中定義),並且在從該函數返回之前使用'signal(SIGINT,SIG_DFL) ' – 2016-06-10 07:43:18

回答

2

你聲明/定義處理程序的位置並不重要。如果您要安裝處理程序,它將處理該進程收到的所有類型的信號。

因此,無論您的標識符的範圍和鏈接如何,一旦您安裝處理程序,它將處理所有事情。

+0

那麼「靜態」的用法是什麼,如果我聲明一個變量爲靜態的,那麼它的範圍應該限於該文件? – kingsmasher1 2011-04-21 05:45:52

+0

這不是'static'的用途。 – cnicutar 2011-04-21 05:47:08

+0

我的意思是這是一個額外的使用靜態(範圍限制文件),請檢查。 – kingsmasher1 2011-04-21 05:48:10

1

你不能直接。

有關特定文件生成給定段代碼的信息不是可執行文件的一部分(調試信息除外,但未由內核使用或解析)。

如果信號僅在某些情況下才起作用,則需要在應用程序和信號處理程序中實現一些邏輯。

(或重新考慮你的應用程序設計並實現兩個獨立的進程。)

+0

但我已經把'sigaction'設爲靜態。 – kingsmasher1 2011-04-21 05:47:26

+0

這是無關緊要的。一旦所有文件都鏈接到可執行文件中,就沒有關於哪個源文件的內容的更多信息。 (除了調試信息,如果有的話,內核沒有使用)* – Mat 2011-04-21 05:49:04

+0

所以,你說,在一個單獨的文件中變量的範圍限制不能用靜態實現? – kingsmasher1 2011-04-21 05:52:15