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

时间:2011-06-03 17:06:41

标签: c linux select system-calls

select(2)(除其他外)告诉我是否可以不阻塞地写入文件的fd。但是,它是否保证我可以写入一个完整的4096字节而不会阻塞?

注意我对磁盘上的普通文件感兴趣。不是套接字等。

换句话说:当我们只能将一个字节写入文件fd而没有阻塞时,select发出信号,在我们写 n时发出信号(4096,...?)字节到文件fd而没有阻塞。

4 个答案:

答案 0 :(得分:3)

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

注意磁盘上的普通文件不会阻止。插座,管道和端子都可以。

答案 1 :(得分:3)

你标记了这个“Linux”,那么内核源代码告诉你什么?读取syscall实现应该很容易找到select决定将文件描述符视为可以写入的时候。

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

答案 2 :(得分:3)

  

注意我对磁盘上的普通文件感兴趣。不是套接字等。

select对普通文件不起作用,只有套接字/管道/ ttys和其他可能,但不是普通文件。对于常规文件,select将始终将文件描述符指示为可读/可写 - 因此将select文件用于文件是一种相当无用的练习。

请注意,这也适用于其他io多路复用设施,例如poll / epoll。 AIO会对常规文件执行异步操作,但操作系统支持可能会有所不同,使用它是一个相当复杂的API

至于你可以写多少数据,没有承诺。 4096是没有神奇的数字,选择假定您可以无阻塞地写,当应用于使用select有意义的文件描述符时(套接字/管道/等)。因为您无法知道可以无阻塞地写入多少数据,所以应始终将文件描述符设置为非阻塞,记录实际写入的数量,如写入/发送的返回值所示,并从该点开始写入下次选择表示您可以再次写入数据。

答案 3 :(得分:1)

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