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

C 如何从多个命名管道接收消息?,c,linux,sockets,named-pipes,fifo,C,Linux,Sockets,Named Pipes,Fifo,我必须在代码中使用fifo 我使用sock来接受新客户。对于每个客户机,我创建新的线程来发送和接收消息给他 在线程的功能中,我使用fifo向另一个进程发送和接收消息,下面是我的代码: int s_to_c=open(myfifo1,O_WRONLY); int c_to_s=open(myfifo2,O_RDONLY); char echoBuffer[RCVBUFSIZE]; int recvMsgSize; for(;;) { bzer

我必须在代码中使用fifo

我使用sock来接受新客户。对于每个客户机,我创建新的线程来发送和接收消息给他

在线程的功能中,我使用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_c
c_to_s
始终取值(3,4)

因此,第一个客户端正确连接发送和接收他的消息

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

请给我一些帮助。我是否应该使用标记,例如???

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

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

如果您在服务器上也看到3和4的组合,那么您在创建管道的代码中有一个bug,而不是在使用管道的地方


如果您使用Linux,有一种简单的方法可以查看文件描述符连接到什么:查看
/proc/PID/fd/
(将PID替换为您要检查的进程的ID)或使用
lsof-n-pPID
(它显示了许多其他内容,以及加载的共享库)。

在您的实际代码中,是否有错误检查?文件描述符得到的值是不相关的,例如,文件描述符
3
(例如)与另一个过程中的文件描述符
3
不同。你总是得到相同的结果,这意味着你在打开管道之前没有使用任何其他描述符。对不起,我不明白你的确切意思。我的代码对第一个客户机正确执行。在服务器中,我打印值:sock=4。s_至_c=6。c_至_s=7。在这个过程中,我有这个值:s_到c=3。c_to_s=4。就像我说的,描述符数字真的不相关,不用担心。我的想法可能很复杂,也不专业。我想在服务器pc中为每个新客户端打开新窗口(新进程),因此我必须在客户端和服务器之间使用套接字。服务器代码和新终端windowSorry之间的fifi这不是我要找的ehar。新线程为每个新客户机创建。在这种情况下,Select无法帮助我。我在想两边的标签?这能帮助我吗?或者我必须使第二个过程中的值不等于(3,4)