プロセスA

Download Report

Transcript プロセスA

プロセス間通信(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)を作成し、動作確認する。