UNIX高级编程-高级I/O

来源:互联网 发布:java软件工程师就业班 编辑:程序博客网 时间:2024/05/22 23:59

第14章高级I/O

14.1 非阻塞I/O

高级I/O:非阻塞I/O、记录锁、系统V流机制、I/O多路转接、readv和writev函数以及存储映射I/O

低速系统调用可能会永远阻塞进程:

1) 某些文件(管道、终端设备、网络设备)的数据不存在,读操作会导致调用者永远阻塞

2) 数据不能立即被上述同样类型的文件接受,写操作会导致调用者永远阻塞

3) 在某种条件发生之前,打开某些类型的文件会被阻塞

4) 对已经加上强制性记录锁的文件进行读写

5) 某些ioctl操作

6) 某些进程间通信函数

 

对于给定的文件描述符有两种方法对其指定非阻塞I/O

1) 调用open获得文件描述符,指定O_NONBLOCK标志

2) 对于已经打开的文件描述符,调用fcntl,打开O_NONBLOCK文件状态标志

 

14.2 记录锁

功能:当某个进程正在读/写文件的某部分时,可以阻止其他进程修改同一文件区。

Int fcntl(int filedes.,int cmd,/*structflock *flockptr */);

Cmd:F_GETLK、F_SETLK、F_SETLKW

Struct flock{

Short l_type;  //共享读锁,独占性写锁,解锁

Off_t l_start;  //加锁或者解锁文件区域的其实字节偏移量

Short l_whence;//SEEK_SET,SEEK_CUR,orSEEK_END

Off_t l_len; //文件区域的字节长度

Pid_t l_pid;//能阻塞当前进程的锁的进程号,返回F_GETLK

}

F_GETLK:判断flockptr所描述的锁是否被另一把锁排斥

F_SETLK:设置flockptr所描述的锁

F_SETLKW:F_SETLK的阻塞版本

通过将l_start设置为0,whence设置为SEEK_SET可以锁住整个文件,多个进程访问同一个文件时,新锁会替换旧锁,当加读锁时,文件描述符必须为读打开,当加写锁时,文件描述符必须写打开

死锁产生的情况:当两个进程相互等待对方持有并锁定的资源时

 

锁的隐含继承与释放:

1) 进程终止,则它所建立的全部锁会释放;当关闭任意文件描述符,其引用的文件上的全部锁释放

2) Fork产生的子进程不继承父进程设置的锁

3) 执行exec后,新程序可以继承原执行程序的锁。

 

建议性锁和强制性锁

强制性锁会对每个read,write,open系统调用都会进行检查,检查调用进程对访问的文件是否违背了某一把锁的作用

0 0
原创粉丝点击