2011-05-19 36 views
1

我是linux编程的小老虎,所以请耐心等待。在我的应用程序中,我fork(),然后execl()设置一个单一的管道读取后,另一个二进制文件。后叉和exec是好的,我做一个dup2()从执行二进制文件读入。我需要我的父应用程序等待它创建的进程的输出,并且一旦输出,就读取它。我想我会使用select(),然后等待几毫秒,然后尝试查看是否有要读取的数据,如果有,请使用read()。然而,我的代码不起作用,因为select()将fd_set作为参数,而我的管道是通过pipe()和dup2()进行int转换的。我能做些什么来克服这一点,还有另一种选择吗?请注意,我不会阻止父进程,直到进程结束,但希望在子进程运行时读取信息。如何在选择分叉和执行后使用管道?

回答

3

要使用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); 

第一个选择参数是您感兴趣的编号最大的文件描述符,再加上一个。那么,以及示例代码,在这里解释: http://linux.die.net/man/3/fd_set

+0

这就是我在linux.die.net上阅读的内容,但它并没有解释任何地方如何或如果我可以使用管道选择。 我必须以某种方式将管道转换为fd_set结构吗?我必须指出它吗?正如我所说,我已经有了一个int foo,这是一个管道,它被dup2欺骗。我可以使用select,如果是,如何? – 2011-05-19 04:03:56

+0

你所说的管道实际上是管道的文件描述符。像John zwinck说的那样,你需要将管道的文件描述符添加到fd_set中。 – Sean 2011-05-19 05:02:20

+0

好吧,我想出了你的帮助肖恩,谢谢。这正是你所说的。声明一个fd_set,使用FD_ZERO,然后使用FD_SET将管道添加到声明的fd_set中。谢谢! – 2011-05-19 21:58:20