2015-05-29 89 views
0

我必須在我的代碼中使用fifo。如何接收來自多個命名管道的消息?

我用襪子接受新的客戶。對於每位客戶,我都會創建新的線程來發送和接收消息給他。

在我使用FIFO來發送和還接收郵件到另一個進程,並在此線程的功能是我的代碼:

int s_to_c=open(myfifo1,O_WRONLY); 
int c_to_s=open(myfifo2,O_RDONLY); 

char echoBuffer[RCVBUFSIZE];   
int recvMsgSize; 

for(;;) 
{ 
    bzero(echoBuffer,RCVBUFSIZE);    
    read(c_to_s, echoBuffer, RCVBUFSIZE); 
    write(sock, echoBuffer, strlen(echoBuffer)); 
    bzero(echoBuffer,RCVBUFSIZE); 

    read(sock, echoBuffer, RCVBUFSIZE); 
    write(s_to_c,echoBuffer,strlen(echoBuffer)); 
} 

close(c_to_s); 
close(s_to_c); 
close(sock); 

而在另一邊(另處理)我的代碼:

int s_to_c=open(myfifo1,O_RDONLY); 
int c_to_s=open(myfifo2,O_WRONLY); 

char echoBuffer[RCVBUFSIZE];  
int recvMsgSize; 
for(;;) 
{ 
    bzero(echoBuffer,RCVBUFSIZE); 
    fgets(echoBuffer,RCVBUFSIZE,stdin); 
    echoBuffer[strlen(echoBuffer)-1]='\0'; 

    write(c_to_s, echoBuffer, strlen(echoBuffer)); 

    bzero(echoBuffer,RCVBUFSIZE); 

    read(s_to_c, echoBuffer, RCVBUFSIZE); 
    printf("%s\n", echoBuffer); 
} 

我的問題是在這個過程中:s_to_cc_to_s採取總是值(3,4)。

所以第一個客戶端連接正確的發送和接收他的消息。

但是,當第二次連接第一個客戶端變爲禁用。第二個客戶端的消息發送和接收來自這兩個進程。

我可以幫忙嗎?我應該使用標籤嗎?

+0

在您的實際代碼中,您*有*有錯誤檢查?並且文件描述符得到的值無關緊要,在另一個進程中,文件描述符「3」(例如)與文件描述符「3」不同。你總是得到相同的意思就是說,在打開管道之前,你還沒有使用過任何其他的描述符。 –

+0

對不起,我完全不明白你的意思。 我的代碼對第一個客戶端正確執行。 在服務器中,我輸出值: sock = 4。 s_to_c = 6。 c_to_s = 7。 在這個過程中,我有這個值: s_to_c = 3。 c_to_s = 4。 –

+0

就像我說過的,描述符的數字真的不相關,不用擔心。 –

回答

0

select()允許您檢查文件描述符(在您的情況下,連接到您的管道)的狀態。當select()返回時,它會告訴你哪些管道有數據要處理。這樣,您可以監視服務器進程中的許多管道。

客戶端進程將始終使用文件描述符3和4作爲管道,因爲這些是stdio(0 = stdin,1 = stdout,2 = stderr)之後的第一個空閒描述符。所以這是正確的。

如果您在服務器上看到3和4的組合,那麼您在創建管道的代碼中存在一個錯誤,而不是在您使用它們的地方。

如果您使用Linux,有一種簡單的方法可以查看文件描述符連接到的內容:查看/proc/PID/fd/(用您想要檢查的進程的ID替換PID)或使用lsof -n -p PID(它顯示了很多其他的東西以及加載的共享庫一樣)。

+0

對不起,這不是我要找的。爲每個新客戶端創建新線程。在這種情況下選擇不能幫助我。我在爲每個兩邊的標籤打招呼?這可以幫助我嗎? –

+0

或者,也許我必須使第二個過程中的值不等於(3,4) –

相關問題