【问题标题】:C signal (sigpipe, sighup) via Socket通过 Socket 的 C 信号(sigpipe、sighup)
【发布时间】:2016-03-23 00:03:55
【问题描述】:

我必须处理 SIGHUP 和 SIGPIPE 信号,以避免通过 Socket TCP 连接的 CLIENT 关闭终端(GUI 的 [X])没有关闭或崩溃 SERVER。

我已经在客户端上设置了这样的 sigup 处理程序

void sighup()
{
  signal(SIGHUP, SIG_IGN);
  system("echo SIGHUP received>>log.txt");
  close(socket);
  exit(0);
}

在服务器上我设置了这样的 SIGPIPE 处理程序

signal(SIGPIPE,SIG_IGN); 

但是,如果客户端关闭了终端的窗口,服务器就会循环。

有什么想法吗? 总之谢谢大家的支持

【问题讨论】:

  • 循环为什么/如何?你在这里没有真正提供足够的信息。我不得不猜测,一旦套接字被破坏,在套接字上进行的读或写调用总是会立即返回,因为现在读/写是一个错误。您需要检测到这一点并丢弃套接字或采取任何适当的措施......如果这就是正在发生的事情......
  • 如果忽略 SIGPIPE,写入操作将返回错误设置 errnoEINTR。只要您始终如一地仔细测试您的写入操作是否成功(并在它们不成功时采取适当的措施——这意味着停止尝试写入),这很有用。否则,这就是灾难的根源。
  • 我犯了一个错误,我将把所有的写入和读取指令都检查为 perror。但是,无论如何,这是处理这种情况的正确方法吗?客户端关闭终端服务器需要继续你有什么建议给我吗?谢谢

标签: c sockets signals sigpipe


【解决方案1】:

我做错了,我会检查所有的读写 带有错误的指示。但是,无论如何,这是正确的处理方式吗 情况?

忽略 SIGPIPE 是可行的。或者,您可以通过将 MSG_NOSIGNAL 标志提供给 send() 来阻止 SIGPIPE 的生成。

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多