等到2 pid写入FIFO(命名管道)

时间:2013-05-17 09:41:51

标签: c linux unix process mkfifo

我尝试使用FIFO(命名管道)和共享内存与服务器客户端进行Tic Tac Toe游戏。

第一步是将客户端进程的pid写入FIFO。 在服务器进程中,我需要等到FIFO中传递了2个pid(来自2个不同的客户端进程)。

现在我只是从管道中读取2但它不能正常工作。我需要在while循环中阅读吗?

客户端代码:

#include <stdio.h>
#include <sys/stat.h> 
#include <fcntl.h>
#include <unistd.h>

void main()
{
    int fd;
    int pid=getpid();
    pid_t pid1=getpid();
    fd=open("fifo_clientTOserver",O_WRONLY);

    write(fd,&pid1,sizeof(pid_t));
    printf("%d\n",pid1);
    while(1);

}

服务器代码:

#include <stdio.h>
#include <sys/stat.h> 
#include <fcntl.h>
#include <unistd.h>

void main()
{
    int fd;
    pid_t pid;
    ftok("shmdemo.c","j");
    mkfifo("fifo_clientTOserver",400);
    fd=open("fifo_clientTOserver",O_RDONLY);
    read(fd,&pid,sizeof(pid_t));
    printf("%d",pid);
    read(fd,&pid,sizeof(pid_t));
    printf("%d",pid);


//sleep(2);
}

我希望服务器等到2个客户端运行,我该怎么做?

非常感谢, 阿萨夫。

1 个答案:

答案 0 :(得分:1)

组织这样的逻辑的一种方法是作为服务器进程的finite-state machine

它将以某种初始状态启动,然后进入等待客户端连接的状态,以及已连接的客户端发送PID。这是两个独立的事件,可以按任何顺序发生。一旦连接了两个客户端并发送了它们的PID,服务器就可以进入初始化游戏的状态,依此类推。

状态机是对这些更改进行建模的便捷方式。

就代码而言,如果您的服务器不需要一直做(但仅响应实际的客户端通信,即玩家进行移动),最简单的方法是使用一个读取客户端数据的中央循环来组织它(并接受新客户),然后可能有一个switch/case语句来处理数据,具体取决于它所处的状态,或者其他东西。