将信号处理为错误

时间:2017-06-05 10:04:39

标签: c sockets signals

您好我正在编写一个线程套接字程序,该程序可能会收到SIGPIPE信号并将退出,如果我捕获信号并忽略它,程序将有未定义的行为,因为我不知道如何将此处理为错误,如何捕获信号并通知需要从具有错误代码的函数返回的代码的当前位置,以便程序流程将继续正常,我想威胁SIGPIPE as它是读/写系统调用中的错误,因为我知道如何在收到它时处理读/写错误。

{
    signal(SIGPIPE,sig_handler);
}

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

  }
}

1 个答案:

答案 0 :(得分: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));