gpt4 book ai didi

c - read(fd, buf, N>0) == 0,但 fd 不在 EOF?

转载 作者:行者123 更新时间:2023-12-03 23:00:29 26 4
gpt4 key购买 nike

下面的小 C 程序(我们称之为 pointless):

/* pointless.c */
#include <stdio.h>
#include <unistd.h>

void main(){
write(STDOUT_FILENO, "", 0); /* pointless write() of 0 bytes */
sleep(1);
write(STDOUT_FILENO, "still there!\n", 13);
}
将打印“还在那里!”正如预期的那样,经过一小段延迟。然而, rlwrap ./pointless在 AIX 下不打印任何内容并立即退出。
显然, rlwrap在第一个 write() 之后读取 0 个字节和
(错误地)决定 pointless已经叫它退出了。
运行时 pointless没有 rlwrap ,并与 rlwrap所有
我可以使用的其他系统(Linux、OSX、FreeBSD),“仍然
那里!”正如预期的那样打印出来。
相关 rlwrap (伪)代码是这样的:
/* master is  the file descriptor of the master end of a pty, while the slave is 'pointless's stdout   */
/* master was opened with O_NDELAY */
while(pselect(nfds, &readfds, .....)) {
if (FD_ISSET(master, &readfds)) { /* master is "ready" for reading */
nread = read(master, buf, BUFFSIZE - 1); /* so try to read a buffer's worth */
if (nread == 0) /* 0 bytes read... */
cleanup_and_exit(); /* ... usually means EOF, doens't it? */
显然,在除 AIX 之外的所有系统上, write ing 0 字节
pty 的从属端是空操作,而在 AIX 上它唤醒 select()在主端。写入 0 个字节似乎毫无意义,但写入 0 个字节
我的测试程序写入随机长度的文本块,这可能
实际上碰巧长度为0。
在 linux 上, man 2 read说明“成功时,读取的字节数为
返回(零表示文件结束)”(斜体是我的)这个
问题有 come upbefore
不提这个场景。
这就引出了一个问题:我怎样才能便携地确定
slave端已经关闭? (在这种情况下,我可能只能等待 SIGCHLD然后关闭商店,但这可能会打开另一 jar
我宁愿避免的蠕虫)

编辑: POSIX状态:

Writing a zero-length buffer (nbyte is 0) to a STREAMS device sends 0 bytes with 0 returned. However, writing a zero-length buffer to a STREAMS-based pipe or FIFO sends no message and 0 is returned. The process may issue I_SWROPT ioctl() to enable zero-length messages to be sent across the pipe or FIFO.


在 AIX 上, pty此外,它确实是一个 STREAMS 设备,而不是管道或 FIFO。 ioctl(STDOUT_FILENO, I_SWROPT, 0)似乎可以使 pty 符合 Unix 世界的其余部分。可悲的是,这必须从slave端调用,外部也是如此 rlwrap s 影响范围(即使我们可以在 ioctl()fork() 之间调用 exec() - 这不能保证执行的命令不会将其改回)

最佳答案

Per POSIX :

When attempting to read from an empty pipe or FIFO:

  • If no process has the pipe open for writing, read() shall return 0 to indicate end-of-file."

所以“读取零字节意味着 EOF”是符合 POSIX 的。
the write() side (粗体我的):

Before any action described below is taken, and if nbyte is zero and the file is a regular file, the write() function may detect and return errors as described below. In the absence of errors, or if error detection is not performed, the write() function shall return zero and have no other results. If nbyte is zero and the file is not a regular file, the results are unspecified.


不幸的是,这意味着你不能移植地依赖 write()因为 AIX 符合 write() 的 POSIX 标准,所以零字节无效。这里。
你可能不得不依赖 SIGCHLD .

关于c - read(fd, buf, N>0) == 0,但 fd 不在 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66117936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com