如何在 fork 和执行后使用带有 select 的管道?

发布于 2024-11-08 11:35:31 字数 348 浏览 3 评论 0原文

我是 Linux 编程新手,所以请耐心等待。在我的应用程序中,我 fork(),然后在设置一个用于读入的单个管道后 execl() 另一个二进制文件。在 fork 和 exec 正常后,我执行 dup2() 从执行的二进制文件的 stdout 读入。我需要我的父应用程序等待它创建的进程的输出,一旦有输出,就读取它。我想我会使用 select(),并等待几毫秒,然后尝试查看是否有数据要读取,如果有,则使用 read()。但是我的代码不起作用,因为 select() 将 fd_set 作为参数,而我的管道是由 pipeline() 和 dup2() 转换的 int 。我能做些什么来克服这个问题,还有其他选择吗?请注意,我不会阻止父进程直到进程结束,而是想在子进程运行时读取信息。

I'm a noob to linux programming, so please bear with me. In my application, I fork(), then execl() another binary after having setup a single pipe for reading in. After the fork and exec are OK, i do a dup2() for reading in from the stdout of the executed binary. I need my parent application to wait for output from the process it has created and once there is output, read it. I figured I will use select(), and wait for a few milliseconds before trying to see if there is data to be read and if there is, use read(). However my code does not work because select() takes as argument an fd_set, while my pipe is of int converted by pipe() and dup2(). What can I do to overcome this and is there another alternative? Note, I'm not blocking the parent process until the process ends, but want to read info while the child process runs.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

单身狗的梦 2024-11-15 11:35:31

要使用 select(),您必须创建一个 struct fd_set 并使用 FD_ 宏填充它。通过这种方式,您将通知函数您对哪些描述符感兴趣(请注意,同时对多个描述符感兴趣是很常见的)。例如:

fd_set rfds;

FD_ZERO(&rfds);
FD_SET(your_input_fd, &rfds);

int retval = select(your_input_fd + 1, &rfds, NULL, NULL, NULL);

select 的第一个参数是您感兴趣的编号最大的文件描述符,再加一。此处解释了这一点以及示例代码:
http://linux.die.net/man/3/fd_set

To use select() you must create a struct fd_set and populate it using the FD_ macros. In this way you will inform the function which descriptors you are interested in (note that it is common to be interested in several at once). For example:

fd_set rfds;

FD_ZERO(&rfds);
FD_SET(your_input_fd, &rfds);

int retval = select(your_input_fd + 1, &rfds, NULL, NULL, NULL);

The first argument to select is to be the highest-numbered file descriptor you are interested in, plus one. That, along with example code, is explained here:
http://linux.die.net/man/3/fd_set

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文