2014-06-06 25 views
1

以下代碼做了什麼?如果在調用sigaction()時將sa_sigaction設置爲NULL,這是什麼意思?

struct sigaction saStruct; 
saStruct.sa_flags = SA_NOCLDWAIT|SA_NODEFER|SA_SIGINFO; 
saStruct.sa_sigaction = NULL; 
sigemptyset(&saStruct.sa_mask); 
sigaction(SIGCHLD, &saStruct, NULL); 

特別是,sa_sigaction被設置爲NULL是什麼意思?這是一種表達更簡單的複雜方式嗎?在sigaction man page中找不到此用法的任何參考。

我主要對Linux的答案感興趣(> = 2.6)。

+0

'NULL'可能被視爲等同於'SIG_DFL'? – alk

回答

2

NULL恰好等於SIG_DFL;不要依賴於此。

#define SIG_ERR ((__sighandler_t) -1) /* Error return. */ 
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */ 
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ 

SIG_DFL等都應分配給sa_handler成員,但(和再次,不依賴於這一點)sa_handler是在Linux上的聯合與sa_sigaction所以分配到NULLsa_sigaction相當於分配SIG_DFLsa_handler

union 
     { 
     /* Used if SA_SIGINFO is not set. */ 
     __sighandler_t sa_handler; 
     /* Used if SA_SIGINFO is set. */ 
     void (*sa_sigaction) (int, siginfo_t *, void *); 
     } 
    __sigaction_handler; 
# define sa_handler __sigaction_handler.sa_handler 
# define sa_sigaction __sigaction_handler.sa_sigaction 
+0

同樣來自文檔的sa_handler應該分配這些值,而不是'sa_sigaction'。它恰好在當前的glibc下工作,因爲'sa_handler'和'sa_sigaction'在同一個聯合中實現。在OP的片段中顯示的內容更加不可取消/可移植。 – alk