2017-06-05 48 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