2014-10-22 71 views
0

我試圖用信號處理程序實現一個簡單的服務器/客戶端。sigset_t在這種情況下很有用嗎?

我的信號只使用會的sigaction(SIG ...... & SIG,NULL),其中:

sig.sa_sigaction = &closeSig; 
sig.sa_flags = SA_SIGINFO; 


void closeSig{ 
    send(ds_sock,"close",1024,0); 
    close(ds_sock); 
    exit(1); 
} 

如果服務器(或客戶端)接收到 「關閉」,它只是關閉連接。

在這種情況下,使用sigset_t是否有用,並在其中添加我想要處理的所有信號,然後像使用sigaction那樣使用sigaction,而不是僅使用e sigaction?

如果它有用,你能解釋我的原因嗎?我有一個測試版程序,它在服務器上使用sigset,但它不在客戶端上。謝謝!

編輯:我剛剛發現,服務器也使用sigprocmask與解除阻止。如果我不想使用它,並且我希望所有信號都暢通無阻,並且立即啓動它們的處理程序,我不必使用sigset,對吧?謝謝!

對不起,但我無法發佈代碼。如果你能幫助我,那很好,如果你不能,謝謝!

+0

您的send()調用沒有意義;它從一個5字節的數組發送1024個字節。我希望這只是一個例子。 – Myria 2014-10-22 04:10:11

+0

@Myria是這只是一個例子,它是早上6點,我仍在學習:( 編輯:無論如何,我不認爲它是完全錯誤的,我的意思是,我發送更多的字節,然後必要的,但這不應該中斷任何事情吧? – testermaster 2014-10-22 04:12:51

+1

讀取數組的末尾有未定義的效果,它可能什麼也不做,它可能會導致核心轉儲,或者可能會做其他事情。 – 2014-10-22 04:26:37

回答

0

closeSig()所示的代碼無效C.爲了可用與sigaction()SA_SIGINFO標誌,則函數的類型需要是:

void closeSig(int signum, siginfo_t *info, void *context) { … } 

第三個參數是一個void *,但也可以是投到ucontext_t *(見sigaction())。

當您撥打sigaction()時,應確保將sig.sa_mask設置爲已知值,可能是使用sigemptyset(&sig.sa_mask);清除所有位。這意味着在調用信號處理程序的同時,其他信號仍可能會中斷信號處理程序。如果您不希望發生這種情況,請改用sigfillset(&sig.sa_mask);;這會在信號處理程序生效時阻止所有信號(可被阻止)。不可阻擋的信號,如SIGKILL仍將交付。


該評論已經確定了所示代碼片段的一些其他問題。

相關問題