Linuxでのプロセス間通信を用いて(IPC)メソッドは
1、ダクト(パイプ)と名前付きパイプ(FIFO)
2、信号(シグナル)
3は、メッセージキュー
4、共有メモリ
5、信号量
6は、ソケットは、
以下に記載します利用パイプ:
パイプは一方向であり、その出力は、一緒に別のプロセスの入力FIFOのプロセスに接続され、処理(ライト処理)書き込みデータテールパイプに、他の処理(読み出し処理)データのヘッダパイプを読み取ります。
データがパイプラインに読み込まれると、プロセスは、空管閉塞が発生したプロセスがデータを書き込み中にパイプを埋めるためにブロックされるのと同じ方法を読み込む際に、このデータのパイプラインは削除されます。
パイプラインは、2つのカテゴリ、名前パイプ(パイプ)と名前付きパイプ(FIFO)に分け、前者は子と異なるプロセス間の通信のために使用される親プロセスとの間の通信のために使用されます。
作成された名前導管を使用してパイプ関数プロトタイプの関数である:
INTパイプ(INT filedis [2]);
filedis 2つのファイル記述子を含む配列である、読み取るための[0]をfiledis、fileids [1]書き込み用。
パイプラインが閉じて使用し、パイプラインをシャットダウンするために必要された後ちょうど2つのファイルディスクリプタを閉じるには、Close関数を使用します。
あなたは無名のパイプを作成すると、子が親プロセス配管を継承するように、パイプは、無名の子プロセスを作成する前に作成する必要があります。
1 #include <unistd.h>
2 #include <sys/wait.h>
3 #include <sys/types.h>
4 #include <errno.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9
10 int main(int argc, char **argv)
11 {
12 int fd;
13 char buf_r[100];
14 int acc;
15
16 memset(buf_r,0,sizeof(buf_r));
17 if ((acc=access(FIFO,F_OK))==-1) { //判断FIFO文件是否已创建
18 if (mkfifo(FIFO,0777) < 0) { //创建FIFO文件
19 printf("fifo can not create\n");
20 exit(1);
21 }
22 }
23 printf("acc = %d\n",acc);
24
25 printf("read byte......\n");
26 fd = open(FIFO,O_RDONLY | O_NONBLOCK,0); //打开FIFO文件
27 printf("open\n"); //测试
28 if (fd == -1) {
29 printf("can not open fifo\n");
30 }
31 printf("while\n");
32 while (1) {
33 memset(buf_r,0,sizeof(buf_r));
34 if (read(fd,buf_r,100) == 0) { //读数据
35 printf("no data\n");
36 }
37
38 printf("read %s from fifo\n",buf_r);
39 sleep(2);
40 }
41 pause();
42 return 0;
43 }
write.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #define FIFO "/home/book/c/fifo/myfifo"
9
10 int main(int argc ,char **argv)
11 {
12 int fd;
13
14 fd = open(FIFO,O_WRONLY | O_NONBLOCK,0);
15 if (fd == -1) {
16 printf("can not open fifo\n");
17 exit(1);
18 }
19 if (write(fd,"hello linux", 14)<0) {
20 printf("write error\n");
21 exit(1);
22 }
23 else {
24 printf("write succse\n");
25 }
26
27 return 0;
28 }
ブローク2つのウィンドウが読むためのコマンド機能と書き込み機能を実行しました