○パイプ

パイプのバッファは 8192 byteです
それ以上溜めるとバッファが溢れて書き込み処理が可能になるまでブロックされます
また、空のバッファから読み出そうとすると、読み出せるまで処理がブロックされます。

■自分のパイプの入力に文字を出力する

#include <stdio.h>

main(){
	int filds[2];
	if(pipe(filds)!=0){
		printf("%s\n","ERR");
		exit(0);
	}

	write(filds[1],"test",4);

	close(filds[1]);//出力パイプを閉じる

	char c;
	while(read(filds[0],&c,1)!=0){//パイプが空になり出力パイプが閉じられるまでループ
		printf("%c\n",c);
	}
}

処理結果

t
e
s
t

■子プロセスと親プロセスをパイプで通信する

#include <stdio.h>

main(){
	int filds[2];
	if(pipe(filds)!=0){
		printf("%s\n","ERR");
		exit(0);
	}
	
	int PID;
	if(PID=fork()){
		//親プロセス
		write(filds[1],"親から子へ",10);//10文字をパイプへ書き込み
		
		wait(&PID);//子プロセスが終了するまで待機

		char buf[20]="";
		read(filds[0],buf,10);//10文字をパイプから読み出し
		printf("%s : %s\n","親",buf);
	}else{
		//子プロセス
		char buf[20]="";
		read(filds[0],buf,10);//10文字をパイプから読み出し
		printf("%s : %s\n","子",buf);

		write(filds[1],"子から親へ",10);//10文字をパイプへ書き込み
		exit(0);
	}
}

処理結果

子 : 親から子へ
親 : 子から親へ

■パイプの連続的な通信(バッファが一杯になると書き込みが一時停止し、バッファが空くと再び書き込みを開始します)

#include <stdio.h>
#include <stdlib.h>

main(){

	int filds[2];
	if(pipe(filds)!=0){
		printf("%s\n","ERR");
		exit(0);
	}
	
	int PID;
	if(PID=fork()){
		//親プロセス
		close(filds[1]);//自分の書き込みパイプを閉じる
		char c;
		while(read(filds[0],&c,1)!=0){//パイプが空になり出力パイプが閉じられるまでループ
			printf("%c",c);
		}
		printf("%s\n","END");
	}else{
		//子プロセス
		int i;
		for(i=0;i<1000;i++){
			char str[10]="";
			sprintf(str,"%d\n",i);
			write(filds[1],str,10);//10文字をパイプへ書き込み
		}
		exit(0);
	}
}


○高水準パイプ

■プロセスを実行して出力を表示します

#include <stdio.h>

main(){
	FILE *fpin;
	fpin=popen("ls","r");
	if(fpin==NULL) exit(0);
	char c;
	while((c=getc(fpin))!=EOF){
		printf("%c",c);
	}
	pclose(fpin);
}


■プロセスを実行してパイプに書き込みます

#include <stdio.h>

main(){
	FILE *fpout;
	fpout=popen("perl test.pl","w");
	if(fpout==NULL) exit(0);
	char*str="test	test	test";
	
	while(*str){
		putc(*str,fpout);
		str++;
	}
	pclose(fpout);
}


○名前付きパイプ
名前付きパイプとはパイプのように扱えるファイル(FIFOファイル)のことです
ファイルですから、異なるプロセスからでもパイプが通ります

FIFOファイルの作成 ファイル名 : pipe
# mknod pipe p


■名前付きパイプに書き込み

#include <stdio.h>
#include <string.h>
#include <fcntl.h>


main(){

	int filds;
	if((filds=open("pipe",O_WRONLY)) == EOF){
		printf("%s\n","err");
		exit(0);
	}
	char str[10];
	sprintf(str,"%s","SendTestStr");	
	write(filds,str,strlen(str));
	close(filds);

}

■名前付きパイプから読み出し

#include <stdio.h>
#include <fcntl.h>


main(){

	int filds;
	if((filds=open("pipe",O_RDONLY)) == EOF){
		printf("%s\n","err");
		exit(0);
	}
	char c;
	while(read(filds,&c,1)){
		printf("%c",c);
	}
	close(filds);

}



▲トップページ > Linux と C