apue 第14章 高级I/O

记录锁:

fcntl(int fd,int cmd,struct flock *flockptr)

cmd:F_GETLK 

F_SETLK 非阻塞,失败时会立即返回,并设置errno为EACCES EAGAIN

 F_SETLKW 阻塞式,会在可加锁时返回或者由信号中断

记录锁的继承和释放:

1、进程终止时,释放所有锁

2、进程对文件F设置了锁,那么该进程中任何一个打开了文件F的文件描述符被关闭,都会释放进程对文件F设置的锁

3、fork后子进程不会继承父进程的锁

4、如果文件描述符标志位(执行时关闭标志位)没有被设置,那么调用exec后,新的程序继承文件锁,否则,释放所有锁

struct flock

{

short l_type  /*F_RDLCK F_WRLCK F_UNLOCK*/

short l_whence //SEEK_SET SEEK_CUR SEEK_END

off_t start

off_t len

pid_t pid //持有锁的进程ID

}

在文件尾加锁时,会对新写入的数据也加锁,这时要解锁的话,要SEEK到加锁之前的pos;


建议锁和强制锁

http://blog.sina.com.cn/s/blog_779fba530100ugrd.html

1、              建议锁又称协同锁。对于这种类型的锁,内核只是提供加减锁以及检测是否加锁的操作,但是不提供锁的控制与协调工作。也就是说,如果应用程序对某个文件进行操作时,没有检测是否加锁或者无视加锁而直接向文件写入数据,内核是不会加以阻拦控制的。因此,建议锁,不能阻止进程对文件的操作,而只能依赖于大家自觉的去检测是否加锁然后约束自己的行为;

2、              强制锁,是OS内核的文件锁。每个对文件操作时,例如执行open、read、write等操作时,OS内部检测该文件是否被加了强制锁,如果加锁导致这些文件操作失败。也就是内核强制应用程序来遵守游戏规则;

强制锁会导致带有O_TRUNC的open函数失败,erron设置为EAGAIN

如果使用ed编辑带有强制锁的文件,会绕过强制锁(ed会删除原来的文件,将临时文件改为源文件),强制锁对unlink没有影响

使强制锁起作用:

1、mount -o mand

2、打开设置组id,关闭组执行位


I/O多路转接

select(int maxfdpl,fd_set *restrict readfds,fd_set *restrict writefds,fd_set *restrict exceptfds,struct timeval *restrict tvptr)

构造一张由读文件描述符集readfds、写文件描述符集writefds和异常条件集exceptfds构成的表,当其中有一个文件描述符准备好时(可以无阻塞的进行读、写操作)或者异常条件中有一个未决异常条件,select函数返回正值,表示三个描述符中准备好的个数,并修改三个文件描述符集,这时仍存在于描述符集中的fd就是已准备好的

返回0表示在tvptr指定的时间内没有文件描述符准备好,tvptr=NULL表示无超时,即永远阻塞,tvptr->tv_sec==0&&tvptr->tv_usec==0,表示不阻塞,else,表示阻塞到tvptr所指定的时间

返回-1表示出错返回,在没有文件描述符准备好的情况下被信号中断。

maxfdpl是三个文件描述符集中最大的文件描述符的值+1

pselect将timeval改为timespec(usec->nsec),并增加了一个信号屏蔽字参数

文件描述符集的设置函数:

int FD_ISSET(int fd,fd_set *fdset)//fd是否为fd_set的成员

void FD_CLR(int fd,fd_set *fdset)//在fdset中清楚fd

void FD_SET//在fdset中添加fd

void FD_ZERO(fdset) //清空fdset


poll(struct pollfd fdarray[],nfds_t nfds,int timeout)

select函数的文件描述符是按功能分成一个集合,而poll是一个文件描述符数组struct pollfd fdarray[],包含了nfds个文件描述符,并对每个文件描述符的读写异常进行设置

struct pollfd

{

int fd;

short events; //设置对该文件描述符所关心的事件

short revents; //poll函数返回时由内核设置,表示发生了什么事件

}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值