#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
和之间有什么区别2
?1
答案1
我知道如何进行重定向,但是将这种技术与命令行参数一起使用非常令人困惑。我什么都不知道。
请更详细地描述到底是什么让您感到困惑。对我来说,结果非常符合预期:如果文件对象以只读方式打开(如“<”重定向),F_GETFL 将给出 O_RDONLY。其他类型的重定向也是如此。
如果没有重定向,子命令将获得与父命令相同的标准描述符。在典型的交互情况下,它是用户终端,所有描述符都是可读写的。决定将它们设置为只读、只写等是没有用的,因为使用相同的描述符进行交互式终端活动(例如使用 的全屏活动curses
)比将其拆分为 0 用于终端输入、1更方便用于终端输出等;但这并没有扩展到用户指定的重定向。这就是你问的事吗?
当我们使用重定向时, &2 ,&1 和 2, 1 有什么区别?
如果您指的是2>1
和 之类的形式2>&1
,那么它们主要是不同的。2>1
将 2 重定向为写入 file 1
。2>&1
将 2 重定向为描述符 1 的副本(在 C 级别上,这是dup2(1,2)
)。对于数字 n、mn<&m
来说,两者n>&m
是相同的,并且不会对访问模式添加限制。