linux,write()系统调用在尝试写入文件时返回-1

时间:2010-10-20 19:19:15

标签: c linux

在下面的程序中,write()在写入文件时返回-1。

   #include<sys/types.h>
   #include<sys/stat.h> 
   #include<fcntl.h>   
   #include<stdio.h>   
   #include<unistd.h> 
   #include<stdlib.h>
   int main() {

   int fd_r=0,fd_w=0;
   int w_ret=100;
   fd_r = open("reader.txt", O_RDONLY);

   fd_w = open("writer.txt",O_CREAT,S_IRWXU);

   char *buf = (char *)malloc(50);

   while(read(fd_r,buf,30))
   {

          w_ret =   write(fd_w,buf,30);
          printf("%d", w_ret);
   }
}

问题:我无法调试为什么会发生这种情况。关于如何调试此类问题的代码更正和建议非常受欢迎

3 个答案:

答案 0 :(得分:5)

我不相信O_CREAT本身对于旗帜有效:尝试O_CREAT | O_WRONLY

调试的一种方法是在第一次打开时检查fd_w文件描述符是否有效。

“参数标志是O_RDONLY,O_WRONLY或O_RDWR之一,它们分别以零或多个以下方式按位或按顺序打开文件为只读,只写或读/写......” http://www.linuxmanpages.com/man2/open.2.php

答案 1 :(得分:3)

位于程序的顶部

#include <errno.h>

打开读取返回-1时,打印errno的值(在errno.h中定义),然后在errno.h中查找该错误意味着什么(你将在整个C阶段都需要这个,所以我给了你所有这些,而不仅仅是这个问题的解决方案)

答案 2 :(得分:1)

如果添加一些错误处理,您可以了解更多信息。 e.g。

  #include<sys/types.h>
   #include<sys/stat.h>
   #include<fcntl.h>
   #include<stdio.h>
   #include<unistd.h>
   #include<stdlib.h>
   int main() {

   int fd_r=0,fd_w=0;
   int w_ret=100;
   fd_r = open("reader.txt", O_RDONLY);
   if(fd_r == -1)
     perror("fd_r open");

   fd_w = open("writer.txt",O_CREAT,S_IRWXU);
   if(fd_w == -1)
     perror("fd_w open");

   char *buf = (char *)malloc(50);

   while(read(fd_r,buf,30))
   {

          w_ret =   write(fd_w,buf,30);
          if(w_ret == -1) {
            perror("write");
            break;
          }
          printf("%d", w_ret);
   }
}

运行时,如果“reader.txt”不存在:

$ ./a.out
fd_r open: No such file or directory
write: Bad file descriptor

即。毫不奇怪,open()因文件丢失而失败。

运行时,“reader.txt”确实存在:

$ ./a.out
write: Bad file descriptor

这有点微妙,但写文档(man 2 write)说:

  

EBADF fd不是有效文件   描述符或不开放写作。

好。 open()没有失败,所以我们确实有一个有效的文件描述符。所以它“不适合写作。”

确实:

 open("writer.txt",O_CREAT,S_IRWXU);

应该是:

  open("writer.txt",O_CREAT|O_WRONLY,S_IRWXU);