Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
select()和fcntl()之间的差异_C_Unix_Select_File Descriptor_Fcntl - Fatal编程技术网

select()和fcntl()之间的差异

select()和fcntl()之间的差异,c,unix,select,file-descriptor,fcntl,C,Unix,Select,File Descriptor,Fcntl,按照我的理解,我们可以使用fctnl将文件描述符标记为非阻塞,因此每当我们调用该文件描述符上的任何阻塞操作时,它都会出错并修改errno,以指示文件描述符尚未就绪。我们有责任经常轮询文件描述符,并在文件准备就绪时进行读取或写入 使用select,我们传入文件描述符的三个数组(读、写和除),然后select轮询给定时间间隔内的文件描述符,修改数组以指示哪些文件描述符可用于指定操作。而select本身就是一个阻塞操作 现在我的疑问是: 假设我调用选择需要 被读取时,它会超时,而不会检测到任何事件。现

按照我的理解,我们可以使用
fctnl
将文件描述符标记为非阻塞,因此每当我们调用该文件描述符上的任何阻塞操作时,它都会出错并修改
errno
,以指示文件描述符尚未就绪。我们有责任经常轮询文件描述符,并在文件准备就绪时进行读取或写入

使用
select
,我们传入文件描述符的三个数组(读、写和除),然后
select
轮询给定时间间隔内的文件描述符,修改数组以指示哪些文件描述符可用于指定操作。而
select
本身就是一个阻塞操作

现在我的疑问是:

  • 假设我调用
    选择需要
    被读取时,它会超时,而不会检测到任何事件。现在如果我打电话
    
    read
    在其中一个文件描述符上,它将被阻止还是返回 E_会再次阻止/E_,即使我没有先使用
    fcntl

  • 我以10秒的超时调用select,只检查单个文件 描述符。并且可以在文件上读取数据 他几乎马上就走了。在这种情况下,将选择“静止块” 10秒钟

  • 如果
    select()
    超时,但您要读取一个未准备好的阻塞文件描述符,那么您将阻塞。调用
    select()
    根本不会影响文件描述符的行为

  • 如果数据立即就绪,则
    select()
    调用将立即返回。如果数据在1秒后准备就绪,则
    select()
    调用将在1秒后返回。如果在这段时间内没有数据准备就绪(或者数据刚好在超时发生之前到达),它将仅在10秒后返回


  • 大多数情况下,您需要同时使用两者,尤其是在处理套接字时。例如,
    select
    可能表示套接字已准备好在Linux上读取,但缓冲数据包的校验和不正确-它仅在
    读取时进行检查。如果甚至没有一个字节可读取,
    read
    将阻塞。。。所以两者同时存在。啊,好的。谢谢,@AnttiHaapalaI.e。我的观点是,如果您认为非阻塞套接字通常是忙循环的,那么您就错了-
    select
    应该被使用,而2是互补的。