0

我试图将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。这是为什么?

问候

4

2 回答 2

5

这可能是由您运行程序的方式引起的。打字

./myProg foo > bar

将指示大多数 shellmyProg使用参数运行foo并将打印到的任何内容保存stdout在名为bar. 要传递foo>bar作为命令行参数,请使用

./myProg foo \> bar

或者

./myProg 'foo' '>' 'bar'

旁注:因为管道输出到文件 using>是 shell 的一部分,而不是像cat它本身这样的程序,所以您可能不必担心它。只需写入,stdoutshell 将处理其余部分。

于 2012-12-10T16:19:24.500 回答
1

你是什​​么意思the condition in the program is not getting true?你是说你没有看到“inside4”打印到终端?有几件事需要考虑。首先,您不进行错误检查。我们将不得不假设您的所有open电话都dup2成功了。我希望“inside4”被打印到输出文件的末尾。原因很简单,printf实际上并没有写任何东西。它只是将字符串“inside4”存储在缓冲区中,但在程序退出之前,该缓冲区不会写入输出,到那时基础文件描述符已更改为输出文件。最简单的解决方法是在输出中附加一个换行符,然后写printf( "inside4\n" ); 在正常设置中,打印换行符会导致内部缓冲区被刷新。您还可以在调用后显式刷新printf缓冲区fflush

于 2012-12-10T22:22:29.473 回答