ネットワーク・プログラミング 1対多のプロセス間通信.

Slides:



Advertisements
Similar presentations
ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
Advertisements

プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
システムプログラミング 第10回 情報工学科 篠埜 功. 今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ファイルシステムの構造 外部記憶装置のパーティション(区画) ファイルシステムとパーティション(区画) ファイルシステムのmount
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
第2回ネットワークプログラミング 中村 修.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
第13回 プログラミングⅡ 第13回
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
TCPソケットプログラミング ソケットプログラミング TCP-echoのデータ通信手順
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング論 関数ポインタ と 応用(qsort)
Cプログラミング演習 中間まとめ2.
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
マルチスレッド処理 マルチプロセス処理について
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
前回の練習問題.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
プログラミング基礎B 文字列の扱い.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
ネットワーク・プログラミング ソケットオプションとスレッド.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岡村耕二 TCP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
ネットワーク・プログラミング 非同期I/Oとスレッド同期制御.
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング メッセージの作成とセマフォ.
ネットワーク・プログラミング ソケットプログラミングと共有メモリ.
プログラミング 4 文字列.
ネットワーク・プログラミング パイプライン通信とシグナル.
岡村耕二 UDP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング マルチタスク.
ネットワーク・プログラミング プロセスとファイルシステム管理.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

ネットワーク・プログラミング 1対多のプロセス間通信

全体の位置づけ オペレーションシステム(Linux) ソケットプログラミング プロセス カーネルとシステムコール プロセス間通信 スレッド クライアントーサーバ 非同期I/Oとマルチタスク

1.メッセージ通信 1.1 1対多のプロセス間通信 簡単な残高照会プログラム 残高照会プロセス マスタープロセス 1.メッセージ通信 1.1 1対多のプロセス間通信 口座番号:100 口座番号:102 簡単な残高照会プログラム 預金ファイルにある残高を照会するために二つのプログラムを作成する。 残高照会プロセス 標準入力から入力された口座番号をマスタープロセスへ(キュー1を使って)送信する。 マスタープロセスから(キュー2を使って)受信した残高を標準出力する。 マスタープロセス 口座番号から預金ファイル検索。 口座番号が在れば、残高を返信。 口座番号がなければ、0を送信。 照会プロセス msgsnd(); msgrcv(); 照会プロセス msgsnd(); msgrcv(); 100 785 102 キュー2 キュー1 102 1210 100 マスタープロセス msgrcv(); msgsend(); 預金ファイル

1.2 実行結果 [oida@rpc261 soft2]$ gcc -o shokai shokai.c 1.2 実行結果 [oida@rpc261 soft2]$ gcc -o shokai shokai.c [oida@rpc261 soft2]$ gcc -o master master.c [oida@rpc261 soft2]$ cat > yokinfile 100 1210 101 2000 102 785 103 50 [oida@rpc261 soft2]$ ./master & [3] 12182 [oida@rpc261 soft2]$ ./shokai Enter number: 101 Zandaka= 2000 Enter number: 103 Zandaka= 50 [oida@rpc261 soft2]$ ipcs -q ------ メッセージキュー -------- キー msqid 所有者 権限 使用バイト数 メッセージ 0x610180a1 327680 oida 666 0 0 0x7a018093 360449 oida 666 0 0 [oida@rpc261 soft2]$ fg ./master [oida@rpc261 soft2]$ ipcrm msg 327680 360449 リソースを削除しました [oida@rpc261 soft2]$ 預金ファイルyokinfileに書込まれる口座番号と預金残高。キーボードから入力する。 masterをバックグラウンドで実行 使い終えたメッセージキューの削除 口座番号(103)を入力すると預金残高(50)が表示される

msgget メッセージキューを生成し、識別子を得る 1.3 メッセージ通信 msgget メッセージキューを生成し、識別子を得る メッセージ送信(msend.c) メッセージキューを生成しその識別子を得る。 メッセージを送信する。 メッセージ受信(mrecv.c) 受信したいメッセージが入っているメッセージキューの識別子を得る。 メッセージを受信する。 メッセージの構造体 struct msgbuf { long mtypes; char mtext[MSG_SIZ]; }; システムコールの引数 msgsz: 配列 mtext の大きさ msgtyp: 受信したいメッセージタイプ(mtypes)を指定する。 msgflg: IPC_NOWAITを設定すると、メッセージキューにメッセージが無い時、エラーを返す 。 上記以外はメッセージが到着するまで待つ。 インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 書式 int msgget(key_t key, int msgflg); 戻値 成功時 メッセージ識別子、 失敗時 -1 msgsnd メッセージを送信する インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 書式 int msgsnd(int msgid, struct msgbuf *msgp, size_t msgsz, int msgflg); 戻値 成功時 0、 失敗時 -1 利用者が設定 msgrcv メッセージを受信する インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 書式 ssize_t msgrcv(int msgid, struct msg buf *msgp, size_t msgsz, long msgtyp, int msgflg); 戻値 成功時 mtext配列にコピーしたバイト数 失敗時 -1 msgrcvの場合

1.4 残高照会プログラム shokai.c master.c int main() { struct msgbuf { 1.4 残高照会プログラム shokai.c master.c int main() { struct msgbuf { long mtype; char mtext[256]; }; char line[256]; int msqid1, msqid2; key_t msgkey1, msgkey2; struct msgbuf recv, send; msgkey1=ftok("master",'a'); msgkey2=ftok("shokai",'z'); msqid1=msgget(msgkey1,IPC_CREAT|0666); msqid2=msgget(msgkey2,IPC_CREAT|0666); printf("Enter number: "); fgets(line,sizeof(line),stdin); if (sscanf(line,"%ld", &send.mtype)==1) { msgsnd(msqid1,&send,sizeof(send.mtext),0); msgrcv(msqid2,&recv,sizeof(recv.mtext),send.mtype,0); printf("Zandaka= %s\n",recv.mtext); } return EXIT_SUCCESS; int main() { struct msgbuf { long mtype; char mtext[256]; }; int msqid1, msqid2; int searchdata(long key, char *dp, int size); key_t msgkey1, msgkey2; struct msgbuf recv, send; msgkey1=ftok("master",'a'); msgkey2=ftok("shokai",'z'); msqid1=msgget(msgkey1,IPC_CREAT|0666); msqid2=msgget(msgkey2,IPC_CREAT|0666); while(1) { msgrcv(msqid1,&recv,sizeof(recv.mtext),0,0); if (searchdata(recv.mtype,send.mtext, sizeof(send.mtext))==EOF) { snprintf(send.mtext,sizeof(send.mtext),"%ld",0L); } send.mtype=recv.mtype; msgsnd(msqid2,&send,sizeof(send.mtext),0); return EXIT_SUCCESS; 口座番号に対する 残高を検索 mtypeは口座番号 long型の0 自分の口座番号のメッセージを取出す

ファイルから1行読込み、lineに入れる。 ポインタ変数dpから始まる領域にydataをコピー 1.5 残高照会プログラム 関数 searchdata()  int searchdata(long key,char *dp,int size) { FILE *p; long ydata,ynum; char line[256]; p=fopen("yokinfile","r"); while(fgets(line,sizeof(line),p)!=NULL) { if (sscanf(line,"%ld%ld",&ynum,&ydata)==2) { if (key==ynum) { snprintf(dp,size,"%ld",ydata); fclose(p); return 0; } return EOF; ファイルから1行読込み、lineに入れる。 ynumとydataに値が代入された ポインタ変数dpから始まる領域にydataをコピー

宿題15 プログラミングスキル確認 表紙に氏名と学籍番号を書く 本文にプログラムを書く プログラムの実行結果を書く 宿題15  プログラミングスキル確認 (shokai.c, master.c, TCPEchoClient.c,TCPEchoServer.c, HandleTCPClient.c, DieWithError.cを参考にして)HandleTCPClient.cを修正してソケットを使った残高照会プログラムhw15.cを作成せよ。 表紙に氏名と学籍番号を書く 本文にプログラムを書く プログラムの実行結果を書く レポートの締切は来週の水曜日18:00

宿題15 ヒント TCPEchoClient hw15 hw15.c 口座番号 預金残高 宿題15 ヒント TCPEchoClient hw15 口座番号 hw15.c #include <stdio.h> /* for printf() and fprintf() */ #include <sys/socket.h> /* for recv() and send() */ #include <unistd.h> /* for close() */ #include <string.h> #define RCVBUFSIZE 32 /* Size of receive buffer */ int searchdata(long key, char *dp, int size); long id; void DieWithError(char *errorMessage); /* Error handling function */ void HandleTCPClient(int clntSocket) { /* ここに何を書かなければいけないか、考えてください */ } 関数searchdata(long key, char *dp, int size) を最後に追加する。 預金残高 [oida@rpc261 socket]$ gcc -o hw15 hw15.c TCPEchoServer.c DieWithError.c [oida@rpc261 socket]$ ./hw15 5000 & [1] 1852 [oida@rpc261 socket]$ cat yokinfile 100 1210 101 2000 102 785 103 5000 [oida@rpc261 socket]$ ./TCPEchoClient aaa.bbb.ccc.ddd "101" 5000 Handling client aaa.bbb.ccc.ddd Received: 2000 [oida@rpc261 socket]$ ./TCPEchoClient aaa.bbb.ccc.ddd "100" 5000 Received: 1210 [oida@rpc261 socket]$ ./TCPEchoClient aaa.bbb.ccc.ddd "103" 5000 Received: 5000 [oida@rpc261 socket]$ fg ./hw15 5000 [oida@rpc261 socket]$ aaa.bbb.ccc.dddはIPアドレスを表す 口座103の残高は5000