2011-05-19 51 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