我正在编写在不支持 pidfds 的某一方面的代码,这些平台不支持它们(旧版 Linux、其他 Unix)。
我这样做a)是为了在非常旧的平台上测试一些与pidfd相关的代码,b)作为个人挑战。主要是作为个人挑战/为了好玩。
我明确表示不尝试重新实现所有 pidfd 功能;我实际上根本不关心进程/
/proc
/PID。相反,我只是尝试模拟 pidfds 功能的一部分:pidfd 的文件描述符具有三种行为:
fcntl
进入非锁定模式,则在读取时返回 EWOULDBLOCK。EINVAL
。第三部分是棘手的部分,也是此时 pidfd 的一个不寻常的方面(很少有其他东西故意返回
EINVAL
来表示 read()
)。
我想在其他类型的文件描述符上引发这种行为(无论哪种类型)。具体来说,我想要一个文件描述符:
O_NONBLOCK
(或不)行为。read(2)
的调用通常不会返回错误,而是返回EINVAL
,无论read(2)
的参数如何。事实证明这非常棘手。
read(2)
的 手册页 的 EINVAL
表示在以下情况下会返回:
fd 附着在不适合读取的对象上;或者 文件是使用 O_DIRECT 标志打开的,并且地址 buf 中指定的值、count 中指定的值或文件偏移量是 没有适当对齐。
...或者如果将无效的缓冲区大小传递给计时器fd上的
read(2)
。
timerfd 情况和
O_DIRECT
情况都不满足我的要求,因为它们仅在某些参数传递给 EINVAL
时才返回 read(2)
,并且我希望在所有非错误情况下都返回它。
我还尝试过 signalfds(找不到在读取时返回 EINVAL 的情况)、inotify FD(相同)以及强制
close(2)
d 或 shutdown(2)
管道、FIFO 和匿名套接字的各种排列。
不过,我不太精通 POSIX 琐事,所以我完全有可能错过了一些允许我已经尝试过的文件描述符类型返回的东西
EINVAL
。
如果有一个可以在 BSD/MacOS 上运行的解决方案,那就加分了,但实际上有总比没有好,即使特定于 Linux 或特定于内核版本。
例如您可以简单地
close(fd); read(fd, ....);
可能会返回 EINVAL
。