2016-12-10 50 views
0

我需要一些幫助,msgrcv共存......我需要能夠收到這樣的消息:Ç - 讓msgrcv與信號

while(1){ 
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0) 
    if(status < 0) { perror("something wrong..."); exit(1); } 
} 

而且還某處代碼:

void stuff_to_do(int signal){ 
    // .... 
} 
//... 
signal(SIGQUIT, stuff_to_do); 

但我得到一箇中斷系統調用,可能是因爲信號殺死了msgrcv或類似的東西。 我該如何解決這個問題?我應該fork()並在一個進程中執行msgrcv並在另一個進程上執行這些任務?或者,還有更好的方法? 感謝您的幫助!

+0

不要嘗試fork()分割任務,這隻會讓事情變得複雜。無論調用msgrcv()的進程是否仍然可以接收信號並中斷。 – e0k

+0

@ e0k是的,這是真的......我認爲它會解決它,但它不會,因爲我需要停止帶信號的while(1)。謝謝! –

回答

1

是的,如果您的進程在msgrcv()期間收到信號,它將被中斷。

man pages on msgrcv()

調用進程捕獲的信號。在這種情況下,系統調用失敗,errno設置爲EINTR。 (msgrcv()是不會被任何信號處理程序中斷後建立的信號處理程序時自動重新啓動,無論SA_RESTART標誌的設置。)

試圖找出這種故障情況和剛剛重啓msgrcv()喜歡的東西

while (1) { 
    // Try to receive message 
    errno = 0; 
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0) 

    if (status < 0) { 
     if (errno == EINTR) continue; // try again 

     // Something else went wrong 
     perror("something wrong..."); 
     exit(1); 
    } 
} 

不要忘了,你必須要測試的操作之前手動設置errno = 0

這讓我想起描述併發性和同時性的good answer。它解釋了爲什麼您必須始終使用嘗試操作的方法,然後檢查它是否成功。


參見:

+0

非常感謝!我會測試它。 –