【LINUX】基础IO(重定向)

基础IO

系统文件IO

在我们操作文件的时候除了fopen,fwrite等等一些接口,我们还可以采用系统接口来进行文件访问。

接口介绍

OPEN

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
返回值:
成功:新打开的文件描述符
失败:-1

这里边包括pathname,flags都有介绍,write,read等等都和C库中的类似。

文件描述符

当我们定义的时候都是

int fd=open(.........)

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

所以在C语言中利用的fp底层就是一个结构体它的结构体里一定包含着描述fd的数据,来当描述符。

0 & 1 & 2

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1,标准错误2.
0,1,2对应的物理设备一般是:键盘,显示器,显示器

重定向

fd分配规则

当我们在代码前close(1)//1是标准输出
然后在write往fd中写数据时候会发现,显示器上不会进行显示,而会写到文件当中。从此就可以推出分配规则。
1.系统会将012分配给标准输入,标准输出,标准错误。(因为底层要和硬件进行交互)
2.当我们提前关闭其中的一个时候会发现,fd会选择下标小的进行分配。
3.这样也就引入了重定向
在这里插入图片描述
这张图就是重定向的本质。

通过代码来看

int main()
{
    
    
close(1);
int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
if(fd < 0){
    
    
perror("open");
return 1;
}
printf("fd: %d\n", fd);
fflush(stdout);
close(fd);
exit(0);
}

先关闭掉close(1)此时1就是最小的下标,open一个文件通过文件描述符fd来描述,此时fd的值就为1,而后边向显示器中输入就会重定向到文件里。

dup2函数

头文件及其定义: #include <unistd.h> int dup2(int oldfd, int newfd);

dup2可以用参数newfd指定新文件描述符的数值。若参数newfd已经被程序使用,则系统就会将newfd所指的文件关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等.
返回值:
若dup2调用成功则返回新的文件描述符,出错则返回-1.

猜你喜欢

转载自blog.csdn.net/weixin_43762735/article/details/115309552