linux 底层操作之 IO操作(一)

内容概要

掌握open,read,write,close,lseek,dup,dup2等底层IO函数的使用

实验内容

  1. 编写程序2_1.c,在一个程序中连续两次打开同一个文件,并输出文件描述符,察看输出结果是否相同.
  2. 编写程序2_2.c,实现功能,打开一个文件,打印出此文件的文件描述符,让程序不退出,开另一个终端,再运行它,看两个终端的输出结构是否相同。思考原因.
  3. 用系统IO创建一文件,接着在文件中写入”hello,I’m writing to this file!”,然后再把文件的前10个字节打印出来
  4. 用系统IO编写mycopy.c 实现系统的cp 命令。
  5. 理解dup(),dup2()等函数的用法。利用system()函数,在程序内部分别执行成功和失败的两个命令,比如System(“ls”);     System(“ls zzz”);
  6. 理解文件锁,并会使用fcntl函数。
  7. IO多路复用

1. 

                             

2. 原因是,文件描述符并不是一个随机值,而是进程打开文件获得文件系统返回的一个索引值,相同的文件在磁盘中,inode和block记录信息和编号都是相同的,以及所在分区以及超级块也是相同的。

3.

4.

5.

dup:

read中的STDIN_FILENO是重定向流,在命令行输入的信息存到文件中

参考博客:https://blog.csdn.net/silent123go/article/details/71108501

结果:                              终止输入会保存进文件。

上面代码中,nfd 拷贝了 fd,所以 write ( nfd, buf, n ) 这语句写到 nfd 所代表的文件时也就是写到 fd 所代表的文件。程序执行完后可以在相应的目录的hello文件中看到输出。

ps:hello.txt之前有过一段数据.

dup2:

上面的例子使用dup2将标准输出重定向为hello.file文件,如下所示:

6.文件锁的实验:

文件锁跟进程是相关联的,一旦这个进程执行IO一个文件同时给这个文件上锁。执行完成后,由于进程的撤销,此时资源会被释放,之前上的锁也不会继续存在。

PS:文件锁是跟进程关联的。如果给一个文件用fcntl加了锁,又用其它方式(打开然后)关闭了这个文件,那么进程就失去这个锁了,尽管加锁的那个fd还在open着!   转自:https://blog.csdn.net/summonly/article/details/6717990

fcntl函数中cmd参数 F_GETLK :  测试由lock所描述的锁是否能使用。如果存在一把锁,它阻止创建由lock所描述的锁,则将这把现存锁的信息写到lock指向的结构中(l_type-已有锁的类型,l_pid-加锁的进程号)。如果不存在这种情况,则除了将l_type设置为F_UNLCK之外,lock所指向的结构中的其他信息保持不变。

下面我也可以用实验来证明:

这里能够打印出lock.l_type的值,UNLCK是2,WRLCK是1,RDLCK是0

我用的是纯文本命令行,所以要保持一个进程继续运行直接将它转到后台就可以了。然后,同一个文件是可以同时被同一个进程赋予读锁和写锁的,他们不能共存的情况其实是一个上下文,就是当多个进程争夺一个资源时(在我的实验中就是我上锁的文件),如果这个资源被一个进程加上了写锁,那么别的进程没有权限给它再加别的锁,同样如果一个进程上了共享锁,另一个进程也不能给它上写锁,因为写锁不能和共享锁共存,若此资源只有共享锁,那么很多进程可以访问它并且加共享锁。

写锁有个别名交互斥锁。

实验如图:

我将后台运行的另一个访问进程杀掉。

结果        

然后让当前进程保持运行,那么我重新运行它:

现在用另一个进程给它加个共享锁看看:  被锁了,没办法继续访问。

7.IO多路复用:参考博客            https://segmentfault.com/a/1190000003063859

O_NONBLOCK 如果pathname指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。

下面是个人实验图:

       

接受标准输入就是要使用管道之类的,对当前进程文件传输数据,这里我使用了管道。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值