【问题标题】:CommandLine Arguments not working C命令行参数不起作用 C
【发布时间】:2012-11-28 02:08:00
【问题描述】:

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

问候

【问题讨论】:

  • 首先使用\> 转义>。第二次在main() 中打印出argv
  • ./prog File1.txt > File2.txt./prog File1.txt ">" File2.txt 不同。

标签: c unix terminal cat


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    ./myProg foo > bar
    

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

    ./myProg foo \> bar
    

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

    旁注:因为使用> 将输出管道输出到文件是shell 的一部分,而不是像cat 这样的程序本身,所以您可能不必担心它。只需写信给stdout,剩下的就交给shell了。

    【讨论】:

    • 一般来说,允许指定输出路径的命令行应用程序根本不直接使用 > 操作符;相反,它们提供了 --output=<path> 类型参数。
    • @Alfred argc 对于 ./prog File1.txt > File2.txt 是 2。第一个参数是你用来启动程序的路径(./prog),第二个参数是File1.txt
    • 我不确定是什么原因造成的。也许您的打印语句存在问题。
    • 现在我的程序甚至可以使用">"。我不知道是什么原因造成的。我不知道操作系统或终端的这种奇怪行为的任何解决方案
    • 虽然这个答案表明> bar 指示shell 将标准输出重定向到bar,但它并没有说明shell 从命令行中删除>bar,所以传递给程序的最终文本是./myProg foo(适合分隔到 argv 中的字段中)。由于这个问题是从对 shell 如何处理命令行并将它们传递给程序的新手的角度提出的,因此明确描述这些步骤会很有帮助。
    猜你喜欢
    • 2017-06-19
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多