2011-03-01 86 views
0

我正在做一個服務器,它會在連接時產生一個子對象(使用fork),並且當有另一個連接進入時,使用pipe向這個子對象發送另一個套接字。想法是讓子進程管理兩個連接雙人網絡遊戲模式。問題:recvmsg(pfd [0],&message,MSG_WAITALL)總是返回-1而不是被阻止?

家長和孩子之間的IPC管道變量是pfd [2]。

基本上,在子進程中,我做了recvmsg(pfd[0], &message, MSG_WAITALL)等待第二個socket從父進程傳遞。

但是,recvmsg永遠不會被阻塞,並且總是返回-1。

我已經設置PFD [0]阻斷如下:

// set to blocking pipe 
int oldfl; 
oldfl = fcntl(pfd[0], F_GETFL); 
if (oldfl == -1) { 
    perror("fcntl F_GETFL"); 
    exit(1); 
} 
fcntl(pfd[0], F_SETFL, oldfl & ~O_NONBLOCK); 

我怎樣才能讓在recvmsg被阻塞了孩子?

非常感謝任何提示。

回答

1

recvmsg()不適用於管道,而僅適用於套管。當recvmsg()返回-1時,您應該檢查errno值,它可能是EBADF

您可以使用unix sockets而不是pipe在進程之間傳遞文件描述符。

+0

感謝您的回答。我實際上嘗試socketpair而不是管道,它按預期工作。 – 2011-03-01 13:27:24