Tag: sigpipe

在对等端关闭的TCP套接字上写入

我有一个客户端 – 服务器应用程序,其中每一方通过TCP套接字与另一方通信。 我正确建立连接,然后在客户端在套接字上写入任何数据之前崩溃服务器。 我看到的是第一次write()尝试(客户端)成功并返回实际的写入字节数,而后面的返回(如我所料) -1 (接收SIGPIPE )和errno=EPIPE 。 为什么第一个write()即使套接字已经关闭也是成功的? 编辑有时候下面的write()也有一个正的返回值,好像一切顺利。

使用信号和sigpipe

我正在进行一项任务,包括使用fork(进程),信号和选择编写程序来处理数据(计算pi)。 我现在正在处理信号,我想我想做的是使用SIGPIPE,所以如果程序捕获它,它会再次尝试写入管道(如果进程试图写入没有读取器的管道,它将被发送SIGPIPE)。 我在main()中使用fork()通过将每个进程发送到worker函数来为它们分配相同的工作。 void worker(int id) { …. (this piece of code is not relevant) if(write(pfd[id][1], &c, sizeof(c)) == -1) printf(“Error occurred: %s\n”,strerror(errno)); } 如何在此函数中实现信号以捕获SIGPIPE并使其再次写入管道? 谢谢!

在封闭连接上写入不会立即生成sigpipe

我在C上的服务器/客户端遇到了这个问题。如果我在SIGINT之后关闭服务器套接字,然后我尝试从客户端写这个关闭的连接,我要写两次,而不是客户端生成SIGPIPE 。 它不应该立即产生吗? 这是正常行为还是我需要解决的问题? 这是我的代码。 我正在ubuntu上测试一些东西,同样的PC,通过127.0.0.1连接。 server.c sigset_t set; struct sigaction sign; int sock_acc; int sock; void closeSig(){ close(sock_acc); close(sock); exit(1); } int main(){ sigemptyset(&set); sigaddset(&set, SIGINT); sig.sa_sigaction = &closeSig; sig.sa_flags = SA_SIGINFO; sig.sa_mask = set; sigaction(SIGINT, &sig, NULL); //other code to accept the connection from the client sigprocmask(SIG_UNBLOCK, &set, NULL); //write/read calls } client.c […]