2011-10-30 9 views
4

私はこれをやる方法がわからないので、大きなトラブルを抱えています。 私はコミニケーションできるプロセスを2つだけ作成する必要があります。 コードはこのコードでパイプを使用するにはどうすればよいですか?

/* Wrappers */ 
this->sock_fd = this->w_socket(); 
this->w_bind(); 
this->w_listen(); 

std::cout << "[info] Server is running..." << std::endl; 

while(1) 
{ 
    /*Connection stuff */ 
    struct sockaddr_in client_addr; 
    int client_fd = this->w_accept(&client_addr); 
    char client_ip[64]; 
    int client_port = ntohs(client_addr.sin_port); 
    inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip)); 
    std::cout << "[info] Connection from (" << client_ip 
     << ", " << client_port << ")" << std::endl; 

    /*Login manager*/ 
    ... 

    /* Crate PID */ 
    int pid = fork(); 
    if (pid == 0) 
    { 
     close(this->sock_fd); 
     this->manage(client_fd, client_ip, client_port); 
     exit(0); 
    } 
    /* End connection */ 
    close(client_fd); 
} 

です。ログインマネージャの後にクライアントが正常に認証されると、サーバーにデータを送信できます。 クライアントが接続されていて、別のクライアントがログインしている場合、2番目のクライアントは最初のクライアントを「接続が解除されました」というメッセージで起動する必要があります。 これを行うにはどのようにフォークとパイプを使用できますか? 私はこれについて何かを読もうとしましたが、少し混乱しています。

ありがとうございます。

+2

http://en.wikipedia.org/wiki/SIGPIPE – sehe

答えて

1

私はあなたのプロジェクトの特定のデザインについてはわかりませんが、fork()を使って既存のクライアントから新しいクライアントを作成し、pipe()を使用して通信したい場合、ここにサンプルコードがあります。

int pfds[2];   //pipe() always return pair of file descriptors(fds). 
char buf[30]; 

pipe(pfds);   //fds will be stored in pfds. 

if (!fork()) { 
    printf(" CHILD CLIENT: writing to pipe\n"); 
    write(pfds[1], "New Client", 11); 
    printf(" CHILD CLIENT: exiting\n"); 
    exit(0); 
} else { 
    printf("PARENT CLIENT: reading from pipe\n"); 
    read(pfds[0], buf, 11); 
    printf("PARENT CLIENT: read \"%s\"\n", buf); 
    //Take appropriate Action upon read!!! 
    wait(NULL); 
} 

この種の通信(信号または共有メモリ)にはパイプを使用するよりも良い選択肢が個人的にあると思います。

関連する問題