トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

プロセス間通信

パイプ

パイプとは,プロセス間の通信を行う一手法である.

プログラム例

sample1.c(14) : 変数で値を共有する例 (だめな例)

forkシステムコールで並行プロセスを生成した場合に,同じ名前の変数(または領域)は完全に独立して生成される.例えば,子プロセスである変数の操作をした場合に親プロセスには反映されない.

sample2.c(15) : プロセス間で通信が出来ている例

pipeシステムコール

パイプを生成するシステムコールである.入出力側の二つのファイルディスクリプタを生成する.

#include <unistd.h>

int
pipe(int *fds);

パイプの生成

記述例

int fd[2]; // fd[1]が入力,fd[0]が出力のファイルディスクリプタ

/* パイプ生成 */
pipe(fd); 

if((pid = fork()) == 0) {
  close(fd[1]); // 入力端を閉じる

  /* 読み込み処理 */

  close(fd[0]);
  exit(0);
}
else if(pid >= 1) {
  close(fd[0]); // 出力端を閉じる

  /* 書き込み処理 */
 
  close(fd[1]);
  wait(0);
}

書き込み

引数には,ファイルディスクリプタ,バッファとなる領域のポインタ,バッファとなる領域のサイズを与える.戻り値は書き込みに成功したバイト数となる.

int write(int fd, char *buf, size_t len);

記述例

/* 構造体bufの値を書き込む */
write(fd[1], &buf, sizeof(buf));

読み込み

引数には,ファイルディスクリプタ,バッファとなる領域のポインタ,バッファとなる領域のサイズを与える.戻り値は読み込んだバイト数となる.

int read(int fd, char *buf, size_t len);

記述例

/* 構造体bufに読み込んだ値を代入する */
read(fd[0], &buf, sizeof(buf));

双方向パイプ

パイプは単方向での通信しか行えないため,双方向の通信を行うためには二本使用する.

プログラム例

sample3.c(13)

記述例

int fd1[2], fd2[2]; // 双方向に通信を行うため,パイプを2本生成する  

/* パイプ生成 */
pipe(fd1);
pipe(fd2); 

if((pid = fork()) == 0) {
  close(fd1[1]); // 入力端を閉じる
  close(fd2[0]); // 出力端を閉じる

  /* fd1[0]を読み込み,fd2[1]を書き込みに利用する */

  close(fd1[0]);
  close(fd2[1]);
  exit(0);
}
else if(pid >= 1) {
  close(fd1[0]); // 出力端を閉じる
  close(fd2[1]); // 入力端を閉じる

  /* fd1[1]を書き込み,fd2[0]を読み込みに利用する */

  close(fd1[1]);
  close(fd2[0]);
  wait(0);
}

ソケット (参考)

Unixで用いられる通信を扱うためのインタフェースである (Windowsでも同様な用語を用いられ,Windows socketと呼ばれる.).

ソケットを用いることにより,クライアント/サーバ型のアプリケーションの作成が行える.

#include <sys/types.h>
#include <sys/socket.h>

/* ソケットを生成する */
int
socket(int domain, int type, int protocol);

/* サーバに接続する (クライアント) */
int
connect(int s, const struct sockaddr *name, socklen_t namelen);

/* ソケットにパラメータを与える (サーバ) */
int
bind(int s, const struct sockaddr *addr, socklen_t addrlen);

/* ソケットを待ち状態にする (サーバ) */
int
listen(int s, int backlog);

/* クライアントの接続を受け入れる (サーバ) */  
int
accept(int s, struct sockaddr * restrict addr, socklen_t * restrict addrlen);

Unixドメインソケット

Unixドメインソケットは,コンピュータ内部での通信を行うために利用される.

sample4.c(25) : クライアント
sample5.c(16) : サーバ

インターネットドメインソケット

インターネットドメインソケットは,TCP/UDPを用いた通信が行える.これにより,遠隔地にあるコンピュータとの通信が可能となる.

sample6.c(16) : クライアント
sample7.c(25) : サーバ