プロセス間通信(ipc)の枠組み プロセス間通信(ipc)の枠組み Inter Process Communication IPC (プロセス間通信)と同期メカニズム パイプライン シグナル メッセージ通信 セマフォによる排他制御 共有メモリ ソケット(UNIXドメイン) ソケット(INTERNETドメイン) プロセス間通信(ipc)の枠組み 4.2 IPC (プロセス間通信)と同期メカニズム シグナル パイプ 循環バッファを使い、アドレス 空間から別のアドレス空間へ データを移動 IPCオブジェクト(メッセージ、セ マフォ)をプロセス間で共有 System V 共有メモリ プロセス A カーネル内のメモリブロックを プロセス間で共有 プロセス B データ 同期 プロセス間通信 •シグナル •パイプライン •メッセージ •セマフォ •共有メモリ •ソケット ソケット ネットワークソケットを使って、 全二重で情報の読書きを行う プロセス C プロセス 同期 System V IPC プロセス間でイベントを通知 カーネル ハードディスク プロセス間通信(ipc)の枠組み 4.3 パイプライン (1) ps | grep ps プロセス A write用 プロセス B read用 プロセス間通信 プロセスA プロセスB pipe(fd); pipe(fd); fd[0] fd[0] fd[1] パイプバッファ パイプバッファ カーネル fd[1] プロセス間通信(ipc)の枠組み 4.3 パイプライン (2) パイプを作る インクルードファイル #include <unistd.h> 書式 int pipe(int filedes[2]); 戻値 成功時 0 失敗時 -1 使用例 int fd[2]; pipe(fd); fd[0] プロセス パイプ バッファ pipe(fd); fd[0] =3 read用 fd[1] =4 fd[1] write用 プロセス間通信(ipc)の枠組み 4.4 シグナル (1) Ctrl-S プロセス A プロセス B プロセスA プロセスB signal(SIG,stop); プロセス間通信 シグナル カーネル void stop() { … } シグナル Ctrl-S プロセス間通信(ipc)の枠組み 4.4 シグナル (2) シグナルを受け取ったときの処理を指定 インクルードファイル #include <signal.h> 書式 sighandler_t signal(int signum, sighandler_t sighandler); 引数 signum シグナルの種類 sighandler シグナルハンドラのアドレス 戻値 成功時 前回のシグナルハンドラのアドレス 失敗時 SIG_ERR 使用例 void stop(); signal(SIGTINT, stop); プロセス signal(SIG,stop); void stop() { … } シグナル プロセス間通信(ipc)の枠組み 4.5 メッセージ通信 (1) プロセス A プロセス B プロセスAとBは、 同じ鍵を持っている プロセスA プロセスB msgget(); msgget(); msgsnd(); msgrcv(); プロセス間通信 メッセージキュー メッセージキュー カーネル カーネル プロセス間通信(ipc)の枠組み 4.5 メッセージ通信 (2) インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> メッセージの構造体 struct msgbuf { long mtypes; char mtext[MSG_SIZ]; }; メッセージキューを生成し、識別子を得る メッセージを送信する メッセージを受信する 書式 int msgget(key_t key, int msgflg); 戻値 成功時 キュー識別子 失敗時 -1 使用例 int msgid; msgid = msgget(msgkey, IPC_CREAT|0666); 書式 int msgsnd(int msgid, struct msgbuf *msgp, size_t msgsz, int msgflg); 戻値 成功時 0 失敗時 -1 使用例 struct msgbuf msgdata, *p; p = &msgdata; msgsnd(msgid, p, sizeof(p->mtext), 0); 書式 ssize_t msgrcv(int msgid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg); 戻値 成功時 mtext配列にコピーしたバイト数 失敗時 -1 使用例 struct msgbuf msgdata, *p; p = &msgdata; msgrcv(msgid, p, sizeof(p->mtext), 0, 0); プロセス間通信(ipc)の枠組み 4.6 セマフォによる排他制御 (1) プロセスAとBは、 同じ鍵を持っている プロセス A プロセス B プロセスA プロセスB semget(); semget(); semop(); semop(); プロセス間通信 セマフォ セマフォ 1 1 1: 使用中 0: 未使用 カーネル カーネル プロセス間通信(ipc)の枠組み 4.6 セマフォによる排他制御 (2) インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> セマフォを操作 セマフォを生成し、識別子を得る 書式 int semget(key_t key, int nsems, int semflg); 戻値 成功時 セマフォ識別子 失敗時 -1 使用例 int semid; buf[0].sem_num = 0; buf[0].sem_flg = 0; semid = semget(semkey, 1, IPC_CREAT|0666); 書式 int semop(int semid, struct sembuf *sops, unsigned int nsops); 戻値 成功時 0 失敗時 -1 使用例 struct sembuf buf[1]; buf[0].sem_op = -1; // lock semop(semid, buf, 1); … buf[0].sem_op = 1; // un-lock semop(semid, buf, 1); struct sembuf { unsigned short int sem_num short int sem_op; short int sem_flg; } プロセス間通信(ipc)の枠組み 4.7 共有メモリ (1) プロセス A プロセス B プロセスAとBは、 同じ鍵を持っている プロセスA プロセスB shmget(); shmat(); shmget(); shmat(); write(); read(); プロセス間通信 共有メモリ 共有メモリ カーネル カーネル プロセス間通信(ipc)の枠組み 4.7 共有メモリ (2) インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> 共有メモリをプロセスにアタッチ 共有メモリを割当て、識別子を得る 書式 int shmget(key_t key, int size, int shmflg); key: 共有メモリを使うプロセス共通のキー size: 確保する共有メモリのサイズ(バイト) shmflg: IPC_CREAT: 新規作成(同じキーで割当て られていれば、既にある共有メモリを使う) IPC_EXCL: 同じキー値で既に割当てられて いれば、エラーを返す アクセス権: ファイルの許可ビットと同じ 戻値 成功時 共有メモリ識別子 失敗時 -1 使用例 shmid = shmget(shmkey, sizeof(in_data), IPC_CREAT|0666); 書式 void *shmat(int shmid, const void *shmaddr, int shmflg); int shmid: const void *shmaddr: アタッチするアドレス(共有メモリ の先頭からのオフセット) shmflg: 共有メモリの操作モード (SHM_RDONLYは、読取りモード、 それ以外は、読書きモード) 戻値 成功時 アタッチされた共有メモリの 開始アドレス 失敗時 -1 使用例 char *pos; pos = shmat(shmid ,0 ,0); 共有メモリ識別子(shmgetの戻値) プロセス間通信(ipc)の枠組み 4.8 ソケット (UNIXドメイン) アプリケーション プログラム(AP) ホスト アプリケーション プログラム(AP) アプリケーション プログラム(AP) ソケット 1 2 65535 1 65535 TCP UDP ソケットが ポートに バインド 2 IP プロセス間通信(UNIX ドメイン) プロセス間通信(ipc)の枠組み 4.9 ソケット (INTERNETドメイン) ホスト ホスト アプリケーション プログラム(AP) アプリケーション プログラム(AP) ソケット ソケット UDP TCP IP TCP ルータ 通信 チャネル IP 通信 チャネル プロセス間通信(INTERNET ドメイン) UDP IP プロセス間通信(ipc)の枠組み レポート課題(4) pipeを生成し、自分の名前をpipeに書き込み、しかる後に、同一のpipeか ら自分の名前を読み取るプログラム(pipe-self.c)を作成し、動作確認する。
© Copyright 2025 ExpyDoc