linux---初识文件系统调用接口


前言

  


提示:以下是本篇文章正文内容,下面案例可供参考

一、文件的打开

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中的文件,将数据打印到文件中

 
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值