当前位置: 技术问答>linux和unix
关于文件描述符的疑问
来源: 互联网 发布时间:2016-05-28
本文导语: 对于套接字来说,当缓冲区中数据多于低潮限度时,套接字为可读,这时使用select函数能够返回正值。 但是对于普通文件描述符来说,它什么时候被标记成可读,或是可写的呢? 我在程序里面用下面的代码,发现fd...
对于套接字来说,当缓冲区中数据多于低潮限度时,套接字为可读,这时使用select函数能够返回正值。
但是对于普通文件描述符来说,它什么时候被标记成可读,或是可写的呢?
我在程序里面用下面的代码,发现fd总是可读的,即FD_ISSET(fd, &readset)总为1,而不管文件a是否为空。不知道是为啥。
int fd = open("a", O_RDONLY);
fd_set readset;
FD_ZERO(&readset);
FD_SET(fd, &readset);
int nfds = select(fd + 1, &readset, NULL, NULL, NULL);
if (nfds == -1)
return -1;
if (FD_ISSET(fd, &readset))
fprintf(stdout, "%d is setn", fd);
但是对于普通文件描述符来说,它什么时候被标记成可读,或是可写的呢?
我在程序里面用下面的代码,发现fd总是可读的,即FD_ISSET(fd, &readset)总为1,而不管文件a是否为空。不知道是为啥。
int fd = open("a", O_RDONLY);
fd_set readset;
FD_ZERO(&readset);
FD_SET(fd, &readset);
int nfds = select(fd + 1, &readset, NULL, NULL, NULL);
if (nfds == -1)
return -1;
if (FD_ISSET(fd, &readset))
fprintf(stdout, "%d is setn", fd);
|
对于普通文件a来说,它始终都是可读的,当然select不会阻塞在它上面的。
|
一般select用于管道、socket等异步操作的设备上,对于文件是可以使用,但一般都不这么用。基本上打开文件后,描述符就已经准备好了,所以,select不会阻塞。
|
select函数主要用于终端I/O和网络I/O,但他对其他描述符同样是起作用的。
|
汗,第一次看到把select用到文件描述符。。。
只读方式打开文件,文件偏移量只要没有到文件尾,就一直是可读的。
只读方式打开文件,文件偏移量只要没有到文件尾,就一直是可读的。
|
可以!但是必須你是文件的屬主或者你具有root權限,然後你去設置這個文件對其它的用戶或者組是否可讀或者
可寫?
可以看一下(第二版),那裏面有詳細的描述和範例