【问题标题】:Write failed, errno 0写入失败,errno 0
【发布时间】:2025-11-28 00:25:01
【问题描述】:

我有一个客户端服务器情况,我使用

接收数据
read(socket, char_buf, BUF_SIZE)

然后尝试使用

将其写入日志文件
write(filefd, char_buf, strlen(char_buf))

奇怪的是这失败了(写返回-1),但错误号设置为0,我可以打印消息,并且日志文件描述符工作(我在这个命令之前和之后写入它)。

发生了什么事??

(在 Linux 内核 2.4 上工作(作业))

【问题讨论】:

  • 确保某些库调用(由错误处理使用)不会覆盖 errno。尝试在 strace 下运行程序。
  • read() 返回什么?它是否按您的预期工作?当您执行fprintf(stderr, "%s\n", strerror(errno)); 之类的操作时,您会看到什么?
  • 我相当肯定 read() 不适用于套接字,只能用于文件,但这不会影响写入。你能显示你处理错误的代码吗?
  • read() 应该在套接字上工作,但它不会让你传入标志或获取发件人的地址(用于数据报)。
  • @vput3833 它说文件描述符错误。我想这可以解决它。虽然我不知道是什么导致 errno 为零。我在同一台机器上运行服务器程序,它使用 pthreads。这会以某种方式弄乱 errno 吗?

标签: c networking linux-kernel


【解决方案1】:
int reads = read(socket, char_buf, BUF_SIZE);

if ( reads != BUF_SIZE )
{
    /* something might have gone wrong */
    fprintf( stderr, "%s\n", strerror( errno ));
}

int writes= = write( filedes, buffer, buffer_size );

if ( writes != buffer_size )
{
    /* something might have gone wrong */
    fprintf( stderr, "%s\n", strerror( errno ));
}

我总是在读或写或类似调用之后做这样的事情。

【讨论】:

    【解决方案2】:

    你检查过你的 read() 的状态吗?它可能有一个错误,导致 char_buf 的长度为零。

    【讨论】:

      【解决方案3】:

      使用调试器逐步检查您的代码,并确保每个语句都在执行您认为应该执行的操作。我打赌你会发现一个更早的错误。

      另外,read() 的返回值也很重要。它告诉您实际读取了多少字节。要成功读取,它可能介于 1 和 BUF_SIZE 之间。

      【讨论】: