使用带有重定向的命令行争论

使用带有重定向的命令行争论
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
        int val;

        if(argc!=2)
        {
                printf("Usage: %s <descriptor> \n", argv[0]);
                exit(1);
        }

        val=fcntl(atoi(argv[1]), F_GETFL, 0);


        switch(val & O_ACCMODE)
        {
                case O_RDONLY:
                        printf("read only");
                        break;
                case O_WRONLY:
                        printf("write only");
                        break;
                case O_RDWR:
                        printf("read write");
                        break;
                default:
                        printf("unknown access mode");
        }

        if(val & O_APPEND)
                printf(", append");
        if(val & O_NONBLOCK)
                printf(", nonblocking");
        if(val & O_SYNC)
                printf(", synchronous writes");

        putchar('\n');
        exit(0);
 }

我有这个代码。无论如何,来源是完全可以理解的。

但是,我对使用带有命令行参数和重定向的程序感到困惑。

使用这个程序和结果如下

    $ ./a.out 0 < /dev/tty
    read only
    $ ./a.out 1 > temp.foo
    $ cat temp.foo
    write only
    $ ./a.out 2 2>>temp.foo
    write only, append
    $ ./a.out 5 5<>temp.foo
    read write

我知道如何进行重定向,但是将这种技术与命令行参数一起使用非常令人困惑。我什么都不知道。

嗯,据我所知,这个程序有 1 个参数,即文件描述符号。

所以,当我使用这个程序时

$ ./a.out 0
read write
$ ./a.out 1
read write
$ ./a.out 2
read write

还行吧。 stdin、stdout、stderr 文件状态为read write.

但是当我使用这个命令进行重定向时。不知道是什么机制在做什么。

例如:

./a.out 0 < /dev/tty

在这里,/dev/tty文件现在与标准输入相同,那么 0/dev/tty到底意味着什么?

当我们使用重定向时&2&1和之间有什么区别21

答案1

我知道如何进行重定向,但是将这种技术与命令行参数一起使用非常令人困惑。我什么都不知道。

请更详细地描述到底是什么让您感到困惑。对我来说,结果非常符合预期:如果文件对象以只读方式打开(如“<”重定向),F_GETFL 将给出 O_RDONLY。其他类型的重定向也是如此。

如果没有重定向,子命令将获得与父命令相同的标准描述符。在典型的交互情况下,它是用户终端,所有描述符都是可读写的。决定将它们设置为只读、只写等是没有用的,因为使用相同的描述符进行交互式终端活动(例如使用 的全屏活动curses)比将其拆分为 0 用于终端输入、1更方便用于终端输出等;但这并没有扩展到用户指定的重定向。这就是你问的事吗?

当我们使用重定向时, &2 ,&1 和 2, 1 有什么区别?

如果您指的是2>1和 之类的形式2>&1,那么它们主要是不同的。2>1将 2 重定向为写入 file 12>&1将 2 重定向为描述符 1 的副本(在 C 级别上,这是dup2(1,2))。对于数字 n、mn<&m来说,两者n>&m是相同的,并且不会对访问模式添加限制。

相关内容