对同一文件描述符的顺序写调用,但仅第二次崩溃?

问题描述

我目前正在编写一个C程序,该程序正在向文件描述符中写入一些数据,其中文件描述符代表打开了该程序连接的其他进程。

我的程序总是在某个时刻崩溃,并且我缩小了执行的最后几个动作的范围,类似于:

write(clientfd,"start",5);
printf("something goes here");
write(clientfd,"end",3);
printf("something else goes here");

写入相同的文件描述符,并写入基本的字符串文字-但是,在执行此程序的过程中,只有前writeprintf消失了-程序似乎崩溃了在第二个write处,因为第二个printf从未出现。

这对我来说似乎没有多大意义。我还打印了第一个write的输出(它实际写入的字节数),它看起来是正确的(在本例中为5),这意味着第一个write调用甚至没有失败,但是第二个错误由于某种不可思议的原因导致程序崩溃。可能需要特别注意的是,对于此文件描述符连接,在客户端的连接端,客户端已经关闭了文件描述符的末尾。我不确定这是否有意义,但自从第一个write成功以来,我就觉得那无关紧要。

任何帮助将不胜感激!

解决方法

对于此文件描述符连接,在连接的客户端上,客户端已经关闭了文件描述符的末端。

在手册页中,我猜您遇到以下错误之一:

  • EBADF fd不是有效的文件描述符,或者未打开以进行写入。
  • EPIPE fd连接到其读取端已关闭的管道或插座。发生这种情况时,写入过程还将收到SIGPIPE信号。 (因此,仅当程序捕获,阻止或忽略此信号时,才会看到写返回值。)

我建议您检查返回值,如果出错,请确保使用perror()进行检查。

错误时,返回-1,并正确设置errno。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...