日期:2014-05-16  浏览次数:20897 次

./a.out 0 < /dev/tty是什么意思啊
1 #include <sys/types.h>
  2 #include <fcntl.h>
  3 #include <apue.h>
  4 
  5 int
  6 main(int argc, char *argv[])
  7 {
  8 int accmode, val;
  9 
 10 // printf("%s,%s",argv[0],argv[1]);
 11 
 12 if (argc != 2)
 13 err_quit("usage: a.out <descriptor#>");
 14 
 15 if ( (val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
 16 err_sys("fcntl error for fd %d", atoi(argv[1]));
 17 
 18 accmode = val & O_ACCMODE;
 19 if (accmode == O_RDONLY) printf("read only");
 20 else if (accmode == O_WRONLY) printf("write only");
 21 else if (accmode == O_RDWR) printf("read write");
 22 else err_dump("unknown access mode");
 23 
 24 if (val & O_APPEND) printf(", append");
 25 if (val & O_NONBLOCK) printf(", nonblocking");
 26 #if !defined(_POSIX_SOURCE) && defined(O_SYNC)
 27 if (val & O_SYNC) printf(", synchronous writes");
 28 #endif
 29 putchar('\n');
 30 exit(0);
 31 }
这是我看UNIX环境高级编程,3-4.c的代码。

上述用法是什么意思啊。。

------解决方案--------------------
其实根据程序就可以看出,a.out应该带一个参数,那2就是参数,后面一个2/3就代表描述符了,呵呵
------解决方案--------------------
第一个2是传入的参数 就是argv[1]
在POSIX shell中,命令的结果可以通过%>的形式来定义(其中%表示文件描述符:1为标准输出stdout、2为标准错误stderr)!系统默认%值是1,也就是1>,而1>可以简写为>,也就是默认为>。
#ls >redout.lst (等同于ls 1>redout.lst,标准输出重定向)
系统先执行>redout.lst,生成一个空文件,然后系统执行ls,再把结果重定向到redout.lst。这时在终端看不到任何信息,但是#more redout.lst可以看到a1、a2、a3、a4和redout.lst。
#./ourgame 2>rederr.lst (标准错误重定向)
因为系统找不到执行脚本ourgame,产生错误,但并不是显示在终端上,而是把错误信息重定向到了rederr.lst。
#more rederr.lst
sh: ourgame: not found.

------解决方案--------------------
探讨

各位,下面是我的理解。不知道有无问题??

Linux中标准输入为0,标准输出为1,标准错误输出为2
$./a.out 0 就是测试标准输入是否可读。因为默认标准输入是终端,终端是可读可写的。故输出为read write

$ ./a.out 0 < /dev/tty 实际是$ ./a.out 0 0< /dev/tty是把/dev/tty重定向为标准输入,而/dev/tty是只读的,……