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
select(2)保证能够在不阻塞的情况下写入文件的数据量是多少_C_Linux_Select_System Calls - Fatal编程技术网

select(2)保证能够在不阻塞的情况下写入文件的数据量是多少

select(2)保证能够在不阻塞的情况下写入文件的数据量是多少,c,linux,select,system-calls,C,Linux,Select,System Calls,select(2)(除其他外)告诉我是否可以在不阻塞的情况下写入文件的fd。但是,它是否保证我可以在不阻塞的情况下写入完整的4096字节 注意我对磁盘上的普通文件感兴趣。不是插座之类的 换句话说:select在我们可以只向文件fd写入一个字节而不阻塞时发出信号,还是在我们可以向文件fd写入n(4096,…)个字节而不阻塞时发出信号。每当select()指示您的文件准备就绪时,您可以尝试为任何n>0写入n个字节write()将返回实际写入的字节数。如果它等于N,你可以再写一次。如果小于N,则下一次

select
(2)(除其他外)告诉我是否可以在不阻塞的情况下写入文件的fd。但是,它是否保证我可以在不阻塞的情况下写入完整的4096字节

注意我对磁盘上的普通文件感兴趣。不是插座之类的

换句话说:
select
在我们可以只向文件fd写入一个字节而不阻塞时发出信号,还是在我们可以向文件fd写入n(4096,…)个字节而不阻塞时发出信号。

每当
select()
指示您的文件准备就绪时,您可以尝试为任何n>0写入n个字节
write()
将返回实际写入的字节数。如果它等于N,你可以再写一次。如果小于N,则下一次写入将被阻止

注意磁盘上的普通文件不会被阻止。套接字、管道和终端都可以。

您标记了这个“Linux”,那么内核源代码告诉您什么呢?当select决定将文件描述符视为准备写入时,读取syscall实现应该非常容易

但是,如果你担心阻塞,那你就错了。如果不想阻塞,请使用
O_NONBLOCK
或等效项。即使
select
确实保证可以在不阻塞的情况下写入一定数量的字节,但只有在
select
返回时才是如此;当您实际执行写操作时,它可能不一定是真的。

select()只承诺可以在不阻塞的情况下进行适用的调用,但它不能保证您的情况下有I/O量(4096)。由于select()可以与不同类型的描述符(文件、套接字、串行连接等)一起使用,因此您可能会注意到,对于磁盘操作,观察到的行为是始终可以写入完整的缓冲区,但这也是特定于特定的底层操作,而不是select()的承诺

注意我对磁盘上的普通文件感兴趣。不是插座之类的

select不适用于普通文件,仅适用于套接字/管道/TTY和其他文件,但不适用于常规文件。对于常规文件,select将始终向文件描述符发出可读/写的信号-因此,将select与文件一起使用是一个相当无用的练习

请注意,这也适用于其他io多路复用设施,如轮询/epoll。将对常规文件执行异步io,但操作系统支持可能会有所不同,而且使用起来相当复杂

至于你能写多少数据,没有承诺。4096并不是一个神奇的数字,select假设您可以在不阻塞的情况下写入,当应用于使用select确实有意义的文件描述符(套接字/管道等)时。因为您不知道在不阻塞的情况下可以写入多少数据,所以应该始终将文件描述符设置为非阻塞,记录实际写入的数据量(由write/send的返回值指示),并在下次选择指示您可以再次写入数据时从该点开始写入