-1

我编写了这段代码来覆盖catUbuntu 中的命令。以下三种cat指令格式可以正常工作,但其余的不能正常工作。

工作人员:

  • ./catf > 文件.txt
  • ./catf < 文件.txt

不工作:

  • ./catf 文件 1.txt > 文件.txt
  • ./catf 文件.txt

我正在将终端参数发送到上面列出的程序。另一个问题是每个文件还包含Enter your String:它不应该包含的内容。这是代码:

int main(int argc, char *argv[])
{
    int readbytes,fp;
    char buf[1024];
    if(argc==1)
    {
        printf("Enter your String :\n\n");
        readbytes=read(STDIN_FILENO,buf,1024);
        write(STDOUT_FILENO,buf,readbytes);
    }
    else 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);
    }
    else if(argc==3)
    {
        if(argv[1][0]=='<')
        {
            fp=open(argv[2],O_WRONLY|O_CREAT,S_IRWXU);
            dup2(1,fp);
            close(fp);
            readbytes=read(STDIN_FILENO,buf,1024);
            write(STDOUT_FILENO,buf,readbytes);
        }
        else if(argv[1][0]=='>')
        {
            fp=open(argv[2],O_RDONLY);
            dup2(1,fp);
            close(fp);
            readbytes=read(STDIN_FILENO,buf,1024);
            write(STDOUT_FILENO,buf,readbytes);
        }
    }
    else if(argc==4)
    {
        printf("inside");
        fp=open(argv[1],O_RDONLY);
        dup2(0,fp);
        close(fp);
        fp=open(argv[3],O_WRONLY|O_CREAT,S_IRWXU);
        dup2(1,fp);
        close(fp);
        readbytes=read(STDIN_FILENO,buf,1024);
        printf("%c",buf);
        write(STDOUT_FILENO,buf,readbytes);
    }
    return 0;
}

更新:

我在代码中进行了威廉建议的更改,其余代码工作正常,但这./catf File.txt ">" File2.txt仍然不起作用。这是为什么?

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);
    }

出现上述问题的原因是什么?

4

2 回答 2

1

当你调用cat > file1.txt*argv[1]不是。相反,是 1 并且 stdout 在调用时已经与文件相关联。如果你想通过 shell 作为参数传递,你需要引用它: <argcmain<

$ cat '<' filename

此外,您调用dup2的参数颠倒了; STDOUT_FILENO应该是第二个参数,而不是第一个。您在argc==2子句中使用它的方式是将其关闭fp并重新打开到原始标准输出。

于 2012-12-10T13:48:39.713 回答
0

正如@William Pursell 所说,重定向由shell 处理,而不是由程序处理。所以程序永远不会看到argv[].

但是,您可以通过 testing 判断您是否已被重定向isatty(fd)。不幸的是,您无法以任何标准方式告诉您被重定向到哪个文件,例如,您可能会被重定向到/来自管道。

Linux 上可能存在 hack,您可以阅读/proc/$$/fd$$您当前的 PID 在哪里)并查看 fds 0、1、2 的符号链接。但是,并非所有 UNIX 都支持此功能。

于 2012-12-10T14:04:47.520 回答