如何从多个命名管道接收消息?

时间:2015-05-29 11:21:18

标签: c linux sockets named-pipes fifo

我必须在我的代码中使用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)。

所以第一个客户端正确连接发送和接收他的消息。

但是当第二个连接时,第一个客户端变为禁用。第二个客户端的消息发送和接收来自两个进程。

我可以帮忙吗。我应该使用标签吗?

1 个答案:

答案 0 :(得分:0)

select()允许您检查文件描述符的状态(在您的情况下是连接到管道的文件描述符)。当select()返回时,它会告诉您哪些管道有要处理的数据。这样,您就可以监视服务器进程中的许多管道。

客户端进程将始终使用文件描述符3和4作为管道,因为这些是stdio之后的第一个免费的(0 = stdin,1 = stdout,2 = stderr)。这是正确的。

如果您在服务器上看到3和4的组合,那么您在创建管道的代码中有一个错误,而不是在您使用它们的位置。

如果您使用Linux,可以通过简单的方法查看文件描述符的连接方式:查看/proc/PID/fd/(将PID替换为您要检查的进程的ID)或使用{{1} }(它显示了许多其他内容以及加载的共享库)。