文件I/O

lseek

每个打开的文件都由一个“当前文件偏移量”,是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都是从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。默认情况下,你打开开一个文件(open),除非指定O_APPEND参数,不然位移量被设为0.

select

之前的read函数可以监控一个文件描述符(eg:键盘)是否有输入,当键盘没有输入,read将会阻塞,直到用户从键盘输入为止。用相同的方法可以监控鼠标是否有输入。但想同时监控鼠标和键盘师傅有输入,这个方法就行不通了。 /dev/input/mice 是鼠标的设备文件 fd = open("/dev/input/mice", O_RDONLY); read(0, buf, 100); read(fd, buf, 100); 在上面的程序中,当read键盘的时候,若无键盘输入则阻塞在第2行,此时即使鼠标有输入,程序也没有机会执行第3行获得鼠标的输入。这种情况就需要select同时监控多个文件描述符。 需要包含的头文件:`` 函数原型:

int select(int maxfd, fd_set * readset, fd_set * writeset, fd_set * exceptset, const struct timeval * timeout)
返回值:失败返回-1,成功返回readset,writeset,exceptset中所有,有指定变化的文件描述符的数目(若超时返回0)

参数: maxfd:要检测的描述符个数, 因此值应为最大描述符+1 readset:被监控是否有输入的文件描述符集。不监控时,设为NULL writeset:被监控是否可以输入的文件描述符集。不监控时,设为NULL exceptset:被监控是否有错误产生的文件描述符集。不监控时,设为NULL timeval:监控超时时间。设置为NULL表示一直阻塞到有文件描述符被监控到有指定变化。

Tips:

readset,writeset,exceptset这三个描述符集指针均是值—结果参数,调用的时候,被监控描述符相应位需要置1;返回时,未就绪的描数字相应位会被清0,而就绪的会被置1。 下面的系统定义的宏,和select配套使用 FD_ZERO(&rset):将文件描述符集rset的所有位清0 FD_SET(4, &reset):设置文件描述符集rset的bit 4 FD_CLR(fileno(stdin), &rset):将文件描述符集rset的bit 0清0 FD_ISSET(socketfd, &rset):若文件描述符集rset中的socketfd位置1
原文地址:https://www.cnblogs.com/loveyan/p/4641059.html