前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、文件的打开
linux中的系统调用接口
通过man手册查询(man 2 open)
(1)char* pathname路径名,实际上也可以写文件名(因为进程会记录当前工作目录的路径会补上完整),
(2)int flags 是文件标识符,它是一个选项(就好比c语言中的fopen()参数)
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
(3)mode 是八进制的文件权限码,创建一个新文件(不存在的)需要指明权限码,不然会出现乱码。
二.文件的读写
(具体可通过man手册查看 :man 2 read)
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
三.文件的关闭
int close(int fd);
这里的fd是open()系统调用函数的返回值,实际上是数组的下标
二.利用文件的fd规则实现文件的重定向
1.fd是什么
linux系统通过fd来管理打开的文件,fd是一个数组的下标,可以理解为文件的身份证。linux系统默认会打开3个流对象,分别是输入流stdin,输出流stdout,错误流stderor.它们的数组下标是 0,1,2.如果我们没有改变0,1下标中的内容,那么c语言中的scanf和printf分别就会从键盘和屏幕,读取和打印数据。
在C语言中fopen()函数中它返回的file *指针结构体里面就存有fd,例如输入流stdin
2.fd的分配规则
如果打开一个文件,linux就会在数组中存一个指向这个文件的指针,数组的下标就是fd.默认是从数组最小下标的并且数据为空给它分配。
3.fd的作用。实际上linux是通过fd来找文件的,在文件的读写关闭的系统函数中,参数中都有fd.
2.实现重定向
(1)实现输入重定向
这里我们用系统调用close函数关闭了stdin文件(键盘),这时数组下标为0的位置就空出来了,打开log.txt文件,根据fd分配规则,这时数组0下标存的是文件log.txt的指针。而scanf是C语言提供的函数,默认是从(fd=0)stdin(键盘文件的缓冲区拿取数据的),而这时我们改变了数组下标0中的文件指向,变成从log.txt中读取数据了。
log.txt中存放了数字5,a的值就是5
(2)实现输出重定向
printf是默认数组下标是1的文件打印数据,我们关闭1,打开一个文件这时数组下标1中存储的时文件test的指针,这样我们原来要把字符串打印到屏幕上转而实现打印到了文件test中。
(3) 用系统接口实现重定向
int dup2(int oldfd, int newfd);
old是我们目标文件的fd,new是重定向的fd. 函数dup2()会将数组下标oldfd的数据拷贝到newfd下标.
打印字符串到文件test 。注意:printf是默认寻找数组下标为1中的文件,将数据打印到文件中