基础IO-文件描述符,重定向

目录

1.文件描述符fd

1.1  0 & 1 & 2

1.2文件描述符的分配规则 

2.重定向

2.1原理

2.2使用dup2系统调用


1.文件描述符fd

1.1  0 & 1 & 2

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2.

0,1,2对应的物理设备一般是:键盘,显示器,显示器。

当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

1.2文件描述符的分配规则 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
    int fd = open("myfile",O_RDWR|O_CREAT|O_TRUNC,0664);
    if(fd < 0){
        perror("open");
        return 1;
    }
    printf("fd: %d\n", fd);
    close(fd);
    return 0;
}

  

 输出发现,fd:3 

关闭0或者2,再看 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
    close(0);
    //close(2);
    int fd = open("myfile",O_RDWR|O_CREAT|O_TRUNC,0664);
    if(fd < 0){
        perror("open");
        return 1;
    }
    printf("fd: %d\n", fd);
    close(fd);
    return 0;
}

发现是结果是: fd: 0 或者 fd 2 ,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

2.重定向

2.1原理

将原本要写入A文件的数据,在并不改变程序逻辑的情况下,写入到B文件中。

常见的重定向有:

>      清空重定向(清空要写入文件的原有内容,将数据写入到该文件中)

>>    追加重定向  (将数据追加写入到要写入文件的后面)

例:./main >/dev/null  2>&1  —— 标准输出重定向到null文件,然后把标准错误重定向到标准输出 

本质原理:

就是将一个描述符所对应位置的文件描述信息地址,给替换成另一个文件的描述地址,这就实现了,在不做其他逻辑改变的情况下,改变了所操作的文件 

2.2使用dup2系统调用

 int dup2(int oldfd,  int newfd);

让newfd对应的位置,保存oldfd对应位置的信息,让new和old都指向old所代表的文件,相当于new重定向到old。

如果newfd本身代表一个已经打开的文件,则重定向前,会把对应文件关闭释放

实例: 

 #include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>
 
 int main()
 {
   int fd=open("./byte",O_RDWR|O_CREAT|O_TRUNC,0664);
   if(fd<0)
   {
      perror("open error");
     return -1;
   }
    dup2(fd,1);//将标准输出重定向到byte这个文件
    char buf[1024]={0};
    ssize_t ret=read(0,buf,1023);//从标准输入读取数据
    if(ret<0)
    {
      perror("read error");
      return -1;
    }
   printf("%s\n",buf);//将读取到的数据输出
   fflush(stdout);//刷新标准输出缓冲区                                                  
   return 0;
 }

 

 

 从上图可以看出,原本应该输出到显示器的数据,输入到了byte文件中,这就实现了将标准输出重定向到byte文件。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值