程序不写在标准输出上而是卡住了
Program doesn't write on the standard output and gets stuck instead
我正在编写的软件应该打开一个文件,该文件必须作为参数传递,并使用打开和写入系统调用将文件内容写入标准输出。 (有点像cat
命令)
问题是一旦我 运行 程序作为
./a.out /example/pattern/file
它在标准输出上写入文件的模式,然后卡住,没有写入任何内容或终止,甚至允许我在终端上写入。
我试过使用 ddd 调试器,但没能找到问题所在。
所有必要的 headers 都包括在内。
int main(int argc,char * argv[]){
printf("%s\n", argv[1]);
int fd, lung;
char buf[10];
if(fd = open(argv[1], O_RDONLY)==-1){
perror("argv[1], in apertura");
exit(EXIT_FAILURE);
}
while(lung = read(fd,buf,10)>0){
if( (write(1, buf, lung))==-1) perror("error");
}
if (lung==-1) {perror("error");exit(EXIT_FAILURE);}
fflush(NULL);
close(fd);
return 0;
}
是不是很可疑?
if(fd = open(argv[1], O_RDONLY)==-1) {
根据operator precedence,==
会在=
之前执行。
然后:
while(lung = read(fd,buf,10)>0){
将同样受到 >
在 =
之前执行的影响。
提示:如有疑问,请使用括号! ;)
while(lung = read(fd,buf,10)>0){
if( (write(1, buf, lung))==-1) perror("error");
}
与(由于运算符优先级)相同:
while(lung = (read(fd,buf,10)>0) ){
if( (write(1, buf, lung))==-1) perror("error");
}
lung
的值将是 1
或 0
。当为0
时,循环会中断当为1
时,只会将1
个字符写入stdout
。
您需要的是:
while( (lung = read(fd,buf,10)) > 0 ){
我正在编写的软件应该打开一个文件,该文件必须作为参数传递,并使用打开和写入系统调用将文件内容写入标准输出。 (有点像cat
命令)
问题是一旦我 运行 程序作为
./a.out /example/pattern/file
它在标准输出上写入文件的模式,然后卡住,没有写入任何内容或终止,甚至允许我在终端上写入。
我试过使用 ddd 调试器,但没能找到问题所在。
所有必要的 headers 都包括在内。
int main(int argc,char * argv[]){
printf("%s\n", argv[1]);
int fd, lung;
char buf[10];
if(fd = open(argv[1], O_RDONLY)==-1){
perror("argv[1], in apertura");
exit(EXIT_FAILURE);
}
while(lung = read(fd,buf,10)>0){
if( (write(1, buf, lung))==-1) perror("error");
}
if (lung==-1) {perror("error");exit(EXIT_FAILURE);}
fflush(NULL);
close(fd);
return 0;
}
是不是很可疑?
if(fd = open(argv[1], O_RDONLY)==-1) {
根据operator precedence,==
会在=
之前执行。
然后:
while(lung = read(fd,buf,10)>0){
将同样受到 >
在 =
之前执行的影响。
提示:如有疑问,请使用括号! ;)
while(lung = read(fd,buf,10)>0){
if( (write(1, buf, lung))==-1) perror("error");
}
与(由于运算符优先级)相同:
while(lung = (read(fd,buf,10)>0) ){
if( (write(1, buf, lung))==-1) perror("error");
}
lung
的值将是 1
或 0
。当为0
时,循环会中断当为1
时,只会将1
个字符写入stdout
。
您需要的是:
while( (lung = read(fd,buf,10)) > 0 ){