我试图将File1.txt ">" File2.txt
作为终端参数传递给我的程序,以便覆盖cat命令。但由于某种原因,该计划无法运作。虽然argc在上面定义的情况下是4,但程序中的条件仍未实现。这是代码:
int main(int argc, char *argv[])
{
int readbytes,fp;
char buf[1024];
if(argc==2)
{
fp=open(argv[1],O_RDONLY);
dup2(0,fp);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
write(STDOUT_FILENO,buf,readbytes);
}
if(argc==4)
{
printf("inside4");
fp=open(argv[1],O_RDONLY);
dup2(fp,0);
close(fp);
fp=open(argv[3],O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU);
dup2(fp,1);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
//printf("%c",buf);
write(STDOUT_FILENO,buf,readbytes);
}
return 0;
}
我找不到这个问题的解决方案,所以我现在就把它留给专家。这个问题出在什么原因?
注意:
由于某些原因,当我发送./prog File1.txt> File2.txt编程,argc==2
条件被选中,但是argc是4.为什么会这样?
此致
答案 0 :(得分:5)
这可能是由于您运行程序的方式造成的。打字
./myProg foo > bar
将指示大多数shell使用参数myProg
运行foo
,并将打印到stdout
的任何内容保存在名为bar
的文件中。要将foo
,>
和bar
作为命令行参数传递,请使用
./myProg foo \> bar
或
./myProg 'foo' '>' 'bar'
旁注:因为使用>
将管道输出到文件中是shell的一部分,而不是cat
本身的程序,所以您可能不必担心它。只需写入stdout
,shell将处理其余部分。
答案 1 :(得分:1)
the condition in the program is not getting true
你是什么意思?你是说你没有在终端上看到“inside4”?有几点需要考虑。首先,您不进行错误检查。我们必须假设您的所有open
和dup2
来电均已成功。我希望“inside4”打印到输出文件的末尾。原因很简单,printf
实际上并没有写任何东西。它只是将字符串“inside4”存储在缓冲区中,但是在程序退出之前,该缓冲区不会写入输出,到那时基础文件描述符已更改为输出文件。最简单的解决方法是在输出中附加换行符,并写入printf( "inside4\n" );
在正常设置中,打印换行符会导致内部缓冲区被刷新。您也可以在调用printf
后调用fflush
来显式刷新缓冲区。