2013-05-17 78 views
0

我試圖用服務器客戶端使用FIFO(命名管道)和共享內存製作井字遊戲。等到2 pid寫入FIFO(命名管道)

第一步是將客戶端進程的pid寫入FIFO。 而在服務器進程中,我需要等到2個pid通過FIFO(來自2個不同的客戶端進程)。

現在我只是在做2從管道讀取,但它不適用。我需要閱讀一段時間循環或什麼?

客戶端代碼:

#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個客戶端運行的,我應該怎麼做呢?

非常感謝, Asaf。

回答

1

組織這種邏輯的一種方法是作爲服務器進程的finite-state machine

它會以某種初始狀態啓動,然後進入等待客戶端連接的狀態,並且也用於已連接的客戶端發送PID。這是兩個單獨的事件,可以按任何順序發生。一旦兩個客戶端連接併發送了它們的PID,服務器就可以進入初始化遊戲的狀態,依此類推。

狀態機是建模這種變化的便捷方式。在代碼方面,如果你的服務器不需要一直做事情(但只是爲了響應實際的客戶端通信,即玩家做出動作),最簡單的方法是用一個讀取客戶端的中央循環來組織它數據(並接受新的客戶端),那麼可能有一個switch/case聲明來處理數據,這取決於它所處的狀態,或者其他。

相關問題