2016-10-11 5 views
1

2つの独立した(フォークなしの)プロセス間でデータ(構造体)を共有するにはどうすればいいですか?私は何をしたい、基本的にはこのようなものである:別の端末で、その後Cの2つのインデペンデントプロセス間でデータを共有

process1: 

Server(PID-399341): Waiting for input.... 

process2: 

Enter server process: 

399341 

Enter a string: 

Hello 

ついに

process1: 

"Hello" has been entered. 

システムQNX/POSIXです。これを行うための私の選択肢は何ですか?

ありがとうございます!

+1

TCP/IP?またはファイルに書き込む? –

+0

共有メモリセグメント? –

+0

FIFO?メッセージキュー?カスタムデバイスですか?ウィキ?他のHTTPサービス? SneakerNet? –

答えて

1

名前付きパイプ(FIFO)を使用すると簡単に実現できます。 あなたのPIDと同じFIFOの名前を選択するだけです。 ここにサーバーとクライアントのための動作コードがあります。

server.c

int fd; 
    char wrbuf[50], buf[10]; 

    printf("Enter server process: "); 
    scanf("%s",buf); 
    getchar(); 

    fd = open(buf,O_WRONLY); 

    printf("Enter message\n"); 

    gets(wrbuf); 

    write(fd, wrbuf, strlen(wrbuf)+1); 

私はPIDと同じキー値を作成することにより、メッセージキューと共有MEMセグメントで行うことができるのと同じだと思う

int fd; 
    char buf[10], rdbuf[50]; 

    sprintf(buf,"%d",getpid()); 

    if(mkfifo(buf,0660) == -1) 
      perror("mkfifo"); 

    printf("Server(PID-%d): Waiting for input..\n",getpid()); 

    fd = open(buf,O_RDONLY); 

    read(fd, rdbuf, 50); 

    printf("%s has been entered\n",rdbuf); 

    close(fd); 

    return 0; 

いるclient.c。しかし、私は確信していません。

+0

こんにちは、ありがとう。シンプルな例を見て、いつもいいです。では、バッファーが変更されたことをサーバーがどのように知っていますか?私はクライアントがサーバーのメッセージを送り続ける無限のwhileループでこれを使用する予定です。 – Senri

+0

この例では、サーバーは常に50文字を読み込みます。そこにヌル文字がある場合、printfはそれだけを印刷します。したがって、バッファは常にサーバによってクリアされ、その後別のメッセージを待つことになります。これはあなたのOSによって注意が払われます。安全な側になるためには、すべてのヌル文字をバッファに書き込んでから書き込んでください。 –

関連する問題