在下面的程序中,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);
}
}
问题:我无法调试为什么会发生这种情况。关于如何调试此类问题的代码更正和建议非常受欢迎
答案 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);