发送套接字 c ctrl+c 行为

out*_*der 5 c sockets

我正在了解一个基于服务器和各种客户端的应用程序,但我在发送命令时遇到问题。每当我在客户端执行ctrl+c操作时,发送操作都会杀死所在的线程和正在运行的进程(为了拥有多个客户端,我将一个线程设置为其中一个)。

如果客户端正确结束(执行关闭套接字),服务器不会死亡,但是当我在客户端上使用ctrl+组合时,两者都会退出。c

我该怎么做才能防止发送命令出现这种行为?

提前致谢

snt*_*upl 6

让我总结一下我认为您的问题是:每当您点击ctrl+c关闭客户端时,服务器就会退出。并且您希望以服务器不会像上面那样崩溃的方式处理此行为。如果这是真的,请继续阅读,我想我也许能够阐明实际问题,它与使用(或不使用)正确的信号句柄并没有太大关系。

ctrl当您使用+关闭客户端时c,操作系统将停止客户端进程并关闭它打开的所有套接字。作为其中的一部分,FIN 将被发送到服务器。

请检查您的代码。我相信您会以一种在来自相关客户端的套接字的 read() 调用中被阻止的方式编写代码。现在,当上面发送的 FIN 到达服务器端套接字时,此读取将返回值 0。

如果您的代码不检查这种情况并尝试将某些内容写回客户端,最终(我跳过中间发生的几个步骤)它将收到 SIGPIPE。这将导致您的服务器崩溃。

如果上述情况成立,您有 2 个出路: 1. 检查 read() 返回 0 并优雅地继续。2.安装SIGPIPE信号处理程序。

顺便说一句,我更喜欢第一种方法。


Jay*_*lor 3

查看beej 的信号指南CTRL您需要捕获并处理+的信号C,即 SIGINT (终端中断信号)。