关于linux重定向的解析

本文详细解析了Linux重定向的概念,通过程序实例说明了不同重定向方式的影响,包括标准输入、输出和错误重定向,以及读写模式和追加模式的使用。重点解释了2>&1的含义,帮助读者理解如何将标准错误重定向到标准输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于linux重定向的解析
apue书中 p64程序清单3.4有4种调用方式及结果
---------------------------------------------
./a.out 0 < /dev/tty
read only
./a.out 1 > temp.foo
write only
./a.out 2 2>>temp.foo
write only, append
./a.out 5 5<>temp.foo
read write
----------------------------------------------
前2个很好解释 大家都能看懂 关键是后面2个 把我害苦了
在网上搜索资料<<linux shell 中"2>&1"含义>>这个看后,终于让我想通了为什么
---------------------------------------------------------------------------
现解释如下:
1) 标准输入0作为参数传递给a.out,
   < /dev/tty 这个虚拟tty文件的输入被重定向到了a.out的标准输入
   也就是a.out的标准输入就变成了/dev/tty
   其实可以写成   ./a.out 0 0</dev/tty
2)第二个同理
   可以写成    ./a.out 1 1>temp.foo
   所以标准输出绑定到了文件temp.foo
   相当于在文件描述符1上打开了temp.foo且是只读的模式
   向标准输出写东西就写到了文件temp.foo
3) 第三个同理
   在文件描述符2上打开了文件temp.foo 而2是标准出错,用了>>表示以追加的模式打开了文件temp.foo
   所以取2的属性就取的是打开文件temp.foo的属性,而这个时候系统已经把文件的状态改了打开且追加的模式
4)同理
   在5上以读写模式打开文件,so取文件描述5的属性就是取文件的属性,那么read and write  就可以理解了
   

-------------------------------------------------------------
取了部分代码放下面:

 

#include "apue.h"
  2 #include <stdio.h>
  3 #include <fcntl.h>
  4 int main(int argc, char * argv[])
  5 {
  6    int i = 0;
  7    int val;
  8    for(; i < argc; i++)
  9    {
 10    printf("%s\n", argv[i]);
 11 
 12     }
 13     val = fcntl(atoi(argv[1]), F_GETFL, 0);
 14     if (val < 0)
 15        err_sys("fcntl error");
 16 switch (val & O_ACCMODE)
 17      {
 18       case O_RDWR:
 19           printf("read write\n");
 20       break;
 21 
 22       }
 23   if (val & O_APPEND)
 24      printf(",append\n");
 25   // printf("O_RDONLY %d\n", O_RDONLY);
 26    //printf("O_RDWR %d\n", O_RDWR);
 27    //printf("O_APPEND %d\n", O_APPEND);
 28    return 0;
 29 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值