2013-03-08 24 views
2

我目前正在試圖通過使用信號,在這種情況下,SIGINT來突破accept()和/或write()的等待。我的計劃沒有按預期離開。我如何使用SIGINT來突破accept()或read()的等待?

void sigHandler(int signal){ 

    printf(" Exit\n"); 

    //x is global 
    x = 1; 

    return; 

} 

我從主我就要掛了剪斷,主要是:

clientfd = accept(sockfd, (struct sockaddr *) &client_addr, (unsigned int *) &client_addr_len); 

當我打這一點,並用我的信號和回報,我仍然停留在這行代碼,等待用戶連接到我的套接字。在處理程序中的x是爲這段代碼所在的外部循環。

有沒有更好的方法來做我想做的事情?另外,讓我知道這是不是足夠的信息。

謝謝。

編輯:

下面是信號,這是回到主畫面頂端的勾。我覺得這是你問什麼:

if (signal(SIGINT, signalhandler) == SIG_ERR){ 
    return(1); 
} 
+1

顯示信號處理程序和插座之間關係的代碼。 – deepmax 2013-03-08 20:19:48

+0

我知道signal()的原型說處理程序只能有一個參數,它是'signal'本身。如果我不能通過它,我不知道如何更改處理程序中的'sockfd'套接字。 – nzondlo 2013-03-08 20:29:48

回答

6

如果您使用建立在signal信號處理程序,那麼accept會自動重新啓動。使用signal類似於使用sigactionsa_flags設置爲包括SA_RESTART。而不是signal,請使用sigaction並確保結構sigaction的sa_flags字段沒有設置SA_RESTART位。

換句話說,而不是:signal(SIGINT, signalhandler),使用方法:

struct sigaction a; 
a.sa_handler = signalhandler; 
a.sa_flags = 0; 
sigemptyset(&a.sa_mask); 
sigaction(SIGINT, &a, NULL); 
+0

非常感謝。 – nzondlo 2013-03-08 20:33:01

+1

不要忘記檢查你的EINTR功能錯誤返回。 – 2013-03-08 22:13:33

+0

在我的情況中,我使用的是sigaction,但並沒有意識到我現有的操作已經設置了SA_RESTART。 – 2015-03-04 21:31:34