C 写入失败,错误号为0

C 写入失败,错误号为0,c,networking,linux-kernel,C,Networking,Linux Kernel,我有一个客户机-服务器的情况,在这种情况下,我使用 read(socket, char_buf, BUF_SIZE) 然后尝试使用 write(filefd, char_buf, strlen(char_buf)) 奇怪的是,这失败了(write返回-1),但errno设置为0,我可以打印消息,日志文件描述符可以工作(我在这个命令之前和之后向它写入) 发生什么事了 (在Linux内核2.4上工作(家庭作业))您是否检查了read()的状态?它可能有一个错误,导致char_buf的长度为零。使

我有一个客户机-服务器的情况,在这种情况下,我使用

read(socket, char_buf, BUF_SIZE)
然后尝试使用

write(filefd, char_buf, strlen(char_buf))
奇怪的是,这失败了(write返回-1),但errno设置为0,我可以打印消息,日志文件描述符可以工作(我在这个命令之前和之后向它写入)

发生什么事了


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

您是否检查了read()的状态?它可能有一个错误,导致char_buf的长度为零。

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

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

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 ));
}

我总是在读或写之类的调用之后执行类似操作。

确保某些库调用(由错误处理使用)不会覆盖errno。尝试在strace下运行程序。read()返回什么?它能像你期望的那样工作吗?当您执行类似于
fprintf(stderr,“%s\n”,strerror(errno))?我相当肯定read()不能在套接字上工作,只能在文件上工作,但这不会影响写入。你能显示你处理错误的代码吗?read()应该可以在套接字上工作,但它不允许你传入标志或获取发送者的地址(对于数据报)。@vput3833它说的是错误的文件描述符。我想这就解决了。虽然我不知道是什么导致错误为零。我在同一台机器上运行服务器程序,它使用pthreads。这会不会把错误弄得一团糟?