gpt4 book ai didi

c - 如何确保具有异步 IO 的管道上的所有输出在关闭前完成

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:13:42 25 4
gpt4 key购买 nike

我使用管道通过向函数传递文件描述符来读取函数的输出。为了异步读取输出,我将管道的“读取”端设置为 ASYNC NON BLOCKING 模式,并使用 SIGACTION 配置 IO 处理程序。我的代码如下所示:

struct sigaction io_act;
struct sigaction io_act_old;
sigset_t block_mask;

/* create the pipe */
pipe (pipe_fd);

/* set the reading end of pipe in ASYNC mode */
fcntl (pipe_fd[0], F_SETOWN, getpid());
fcntl (pipe_fd[0], F_SETFL, O_ASYNC | O_NONBLOCK);

/* add an I/O handler for SIGIO */
sigemptyset (&block_mask);
io_act.sa_handler = sigio_handler;
io_act.sa_mask = block_mask;
io_act.sa_flags = SA_RESTART;
sigaction (SIGIO, &io_act, &io_act_old);

/* executing the function that generate output in given FILEDES */
my_generate_output (pipe_fd[1]);

close(pipe_fd[1]);

/* this sleep should not be needed (subject of question) */
sleep(1);
close (pipe_fd[0]);

/* restore previous signal handler */
sigaction (SIGIO, &io_act_old, NULL);

问题是,如果我省略 sleep 函数调用,我可以在输出完成之前关闭管道并禁用 SIGIO 处理程序。结果是应用程序由于未处理的 SIGIO 信号而中止(消息“I/O possible”)。

在禁用 SIGIO 处理程序之前,如何确保已从管道读取所有输出?

最佳答案

要获取可读字节数,您可以使用 ioctl FIONREAD,不是很便携。参见 this question作为一个人为的例子。

您还可以使用 poll 测试阅读内容的可用性, select和 friend 。

文件结束条件通过 read 返回 0 作为计数来报告。

附录

根据 read(2)系统调用手册页,read 失败,errno ==:

   EAGAIN or EWOULDBLOCK
The file descriptor fd refers to a socket and has been marked
nonblocking (O_NONBLOCK), and the read would block.
POSIX.1-2001 allows either error to be returned for this case,
and does not require these constants to have the same value, so
a portable application should check for both possibilities.

关于c - 如何确保具有异步 IO 的管道上的所有输出在关闭前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8228289/

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