2017-06-05 75 views
0

嗨,我是編程的螺紋插座程序,該程序可能會收到一個SIGPIPE信號,並且將退出,那我要是追到了信號,而忽略它的程序將有不確定的行爲,因爲我不知道如何處理此爲錯誤,我怎麼能趕上的信號,並通知它需要從錯誤代碼的函數返回所以程序流程將繼續正常代碼的當前位置,我想威脅SIGPIPE,因爲它是錯誤在讀/寫系統調用中,導致我知道如何處理讀/寫錯誤,當我收到它們。處理的信號來作爲錯誤

{ 
    signal(SIGPIPE,sig_handler); 
} 

void sig_handler(int signo) 
{ 
    if (signo == SIGPIPE){ 
    printf("hi\n"); 

    } 
} 
+4

的可能的複製[如何防止SIGPIPEs(或妥善處理)](https://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-properly) –

回答

2

如果你想忽略SIGPIPE並直接在你的代碼中處理錯誤。但C中的信號處理程序有很多限制。 最簡單的方法是將SIGPIPE處理程序設置爲SIG_IGN。這將防止任何套接字寫入導致SIGPIPE信號。 要忽略SIGPIPE信號,使用下面的代碼:

signal(SIGPIPE, SIG_IGN); 

OR 來處理這個試試這個:

#include <signal.h> 
/* Catch Signal Handler functio */ 
void signal_handler(int signum) 
{ 
printf("Caught signal SIGPIPE %d\n",signum); 
} 

,並在節目:

/* Catch Signal Handler SIGPIPE */ 
signal(SIGPIPE, signal_callback_handler); 

另一個梅索德是集創建套接字時的套接字選項:更改套接字,使其從不在write()上生成SIGPIPE。

int num = 1; 
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&num, sizeof(int)); 
+3

您應該不**從信號處理程序中調用printf()。 – wildplasser

+0

我們可以在信號處理程序中設置一個標誌,並可以在主程序中監視該標誌。例如:全局聲明這個標誌static int alarm = 0;在信號處理程序中:alarm = 1; //設置標誌並在主程序中檢查該標誌 – suraj