select
/ [1]的手册页pselect
以及这篇 LWN 文章 [2] 明确提到对库函数的调用pselect
不会修改 timeout 参数,而select
调用可能会根据实现而有所不同。LWN 文章提到系统调用pselect
确实修改了超时,并且库函数对调用者隐藏了它。
为什么pselect
指定库方法不修改超时参数?知道是否有时间返回的定时方法似乎是一个有用的功能。
例如,我想等待某个 timespec 来接收 X 个字节。我可以实现一个循环来调用pselect
等待数据,累积读取的任何数据,累积等待所花费的时间,然后根据是否读取了足够的字节或是否经过了足够的时间来决定是否再次循环。由于pselect
没有用剩余时间修改超时参数,我将不得不调用gettimeofday
来计算剩余时间窗口。