linux IPCの配管
Linuxで多く使われているプロセス間通信方式は主に以下のようなものがあります.
1)パイプ(有名パイプと無名パイプ)
2)信号signal
3)メッセージキューMessage Queue:メッセージのリンク表
4)共有メモリShared Memory:最も有効なプロセス間通信方式
5)信号量semaphore:主にプロセス間及び同一プロセスの異なるスレッド間の同期と反発とする
6)ソケットソケットソケットソケット:ネットワーク内の異なる機器間の通信用
無名パイプ
Linuxでは、パイプは非常に頻繁に使用される通信メカニズムです.本質的には、パイプもファイルですが、一般的なファイルとは異なり、パイプはファイルを使用して通信する2つの問題を克服することができます.具体的には、パイプのサイズを制限します.実際、パイプは固定サイズのバッファです.Linuxでは、バッファのサイズは1ページ、すなわち4 Kバイトであり、ファイルのように検査なしに増加しない.単一の固定バッファを使用すると、パイプを書くときに満杯になる可能性があります.この場合、パイプのwrite()呼び出しはデフォルトでブロックされ、一部のデータが読み出されるのを待って、write()呼び出しの書き込みに十分なスペースが空けられます.読み取りプロセスは、書き込みプロセスよりも速く動作することもあります.現在のプロセスデータがすべて読み込まれると、パイプが空になります.この場合、後続のread()呼び出しはデフォルトでブロックされ、一部のデータが書き込まれるのを待つことになり、read()呼び出しがファイルの終了に戻る問題が解決される.注意:パイプからデータを読むのは使い捨てで、データが読むとパイプから捨てられ、より多くのデータを書くために空間を解放します.
ヘッダファイル#include関数定義int pipe(int filedes[2]);関数はpipe()が無名のパイプを確立し、ファイル記述子をパラメータfiledes配列から返します.filedes[0]はパイプを読み、filedes[1]はパイプを書くために使用されます.親関係のあるプロセス間の通信にのみ使用できます.正常に0を返し、エラーは-1を返します.
有名なパイプヘッダファイル
#include
#include
関数の定義
int mkfifo(const char *pathname, mode_t mode);
関数説明mkfifo()は、パラメータpathnameに従って特殊なFIFOファイルを作成します.このファイルは存在しない必要がありますが、パラメータmodeはファイルの権限(mode&~umask)です.
mode specifies the FIFO's permissions. It is modified by the process's umask in the usual way: the permissions of the created file are (mode & ~umask)
umask値はFIFOファイルの権限にも影響し、mkfifo()で確立されたFIFOファイルの他のプロセスは一般ファイルを読み書きする方法でアクセスできます.
Open()を使用してFIFOファイルを開くと、O_NONBLOCKは影響します.O_を使用する場合NONBLOCKの場合、FIFOファイルの読み込みを開く操作はすぐに返されますが、まだ他のプロセスがFIFOを開いて読み取りに来ていない場合、書き込みの操作はENXIOエラーコードを返しますO_を使用していない場合NONBLOCKファイルは、FIFOファイルを開いて読み込む操作は、他のプロセスがFIFOファイルを開いて書き込むまで正常に戻ります.同様に、FIFOファイルを開いて書き込む操作は、他のプロセスがFIFOファイルを開いて読み取るまで正常に戻ります
1)パイプ(有名パイプと無名パイプ)
2)信号signal
3)メッセージキューMessage Queue:メッセージのリンク表
4)共有メモリShared Memory:最も有効なプロセス間通信方式
5)信号量semaphore:主にプロセス間及び同一プロセスの異なるスレッド間の同期と反発とする
6)ソケットソケットソケットソケット:ネットワーク内の異なる機器間の通信用
無名パイプ
Linuxでは、パイプは非常に頻繁に使用される通信メカニズムです.本質的には、パイプもファイルですが、一般的なファイルとは異なり、パイプはファイルを使用して通信する2つの問題を克服することができます.具体的には、パイプのサイズを制限します.実際、パイプは固定サイズのバッファです.Linuxでは、バッファのサイズは1ページ、すなわち4 Kバイトであり、ファイルのように検査なしに増加しない.単一の固定バッファを使用すると、パイプを書くときに満杯になる可能性があります.この場合、パイプのwrite()呼び出しはデフォルトでブロックされ、一部のデータが読み出されるのを待って、write()呼び出しの書き込みに十分なスペースが空けられます.読み取りプロセスは、書き込みプロセスよりも速く動作することもあります.現在のプロセスデータがすべて読み込まれると、パイプが空になります.この場合、後続のread()呼び出しはデフォルトでブロックされ、一部のデータが書き込まれるのを待つことになり、read()呼び出しがファイルの終了に戻る問題が解決される.注意:パイプからデータを読むのは使い捨てで、データが読むとパイプから捨てられ、より多くのデータを書くために空間を解放します.
ヘッダファイル#include関数定義int pipe(int filedes[2]);関数はpipe()が無名のパイプを確立し、ファイル記述子をパラメータfiledes配列から返します.filedes[0]はパイプを読み、filedes[1]はパイプを書くために使用されます.親関係のあるプロセス間の通信にのみ使用できます.正常に0を返し、エラーは-1を返します.
#include
#include
#include
#include
int main(int argc, char **argv)
{
int fd[2];
char buf[1024] = "every day is good day";
int ret=0;
if(pipe(fd) < 0) {//
perror("piple");
exit(1);
}
//fd[0] , fd[1]
pid_t pid;
if((pid = fork()) == 0) { //
close(fd[0]);
ret = write(fd[1], buf, strlen(buf));
if (ret < 0) {
perror("write");
exit(1);
}
printf("write %d bytes [%s]
", ret, buf);
close(fd[1]);
} else if(pid > 0) {
close(fd[1]);
ret = read(fd[0], buf, sizeof(buf));
printf("%d bytes read from the pipe is [%s]
", ret, buf);
if (ret < 0) {
perror("read");
exit(1);
}
close(fd[0]);
}
return 0;
}
有名なパイプヘッダファイル
#include
#include
関数の定義
int mkfifo(const char *pathname, mode_t mode);
関数説明mkfifo()は、パラメータpathnameに従って特殊なFIFOファイルを作成します.このファイルは存在しない必要がありますが、パラメータmodeはファイルの権限(mode&~umask)です.
mode specifies the FIFO's permissions. It is modified by the process's umask in the usual way: the permissions of the created file are (mode & ~umask)
umask値はFIFOファイルの権限にも影響し、mkfifo()で確立されたFIFOファイルの他のプロセスは一般ファイルを読み書きする方法でアクセスできます.
Open()を使用してFIFOファイルを開くと、O_NONBLOCKは影響します.O_を使用する場合NONBLOCKの場合、FIFOファイルの読み込みを開く操作はすぐに返されますが、まだ他のプロセスがFIFOを開いて読み取りに来ていない場合、書き込みの操作はENXIOエラーコードを返しますO_を使用していない場合NONBLOCKファイルは、FIFOファイルを開いて読み込む操作は、他のプロセスがFIFOファイルを開いて書き込むまで正常に戻ります.同様に、FIFOファイルを開いて書き込む操作は、他のプロセスがFIFOファイルを開いて読み取るまで正常に戻ります
#include
#include
#include
#include
#include
#include
#include
#define FIFO "/tmp/myfifo" //
int main(int argc, char **argv)
{
int fd;
int ret = 0;
umask(0);
char buf[]="hello world";
char buf1[1024];
if (mkfifo(FIFO, 07777) < 0) {
perror("mkfifo");
}
pid_t pid;
if ((pid = fork()) == 0){
fd = open(FIFO, O_WRONLY);
ret = write(fd, buf, strlen(buf));
printf("write %d bytes, [%s]
", ret, buf);
close(fd);
} else if(pid > 0) {
fd = open(FIFO, O_RDONLY);
ret = read(fd, buf1, sizeof(buf1));
printf("read %d bytes, [%s]
", ret, buf);
close(fd);
}
unlink(FIFO);
return 0;
}