Unix/Linuxプロセス間通信——配管

2472 ワード

パイプの特性:
1.半二重通信.
2.親プロセスと子プロセスまたは兄弟プロセスの間でしか通信できない.
Unix/Linuxでpipe関数を使ってパイプを作成しましたが、原型は以下の通りです.
#include <unistd.h>

int pipe(int fildes[2]);
は正常に0を返しました.失敗は-1を返します.パラメータfildesは戻りの2つのファイル記述子です.fildes[0]は読みます.fildes[1]は書き込みに使います.
実例は以下の通りです
/* http://beej.us/guide/bgipc/example/pipe1.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

int main(void)
{
	int pfds[2];
	char buf[30];

	if (pipe(pfds) == -1) {
		perror("pipe");
		exit(1);
	}

	printf("writing to file descriptor #%d
", pfds[1]); write(pfds[1], "test", 5); printf("reading from file descriptor #%d
", pfds[0]); read(pfds[0], buf, 5); printf("read \"%s\"
", buf); return 0; }
forkの例を使用します.
/* http://beej.us/guide/bgipc/example/pipe2.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
        int pfds[2];
        char buf[30];

        pipe(pfds);

        if (!fork()) {
                printf(" CHILD: writing to the pipe
"); write(pfds[1], "test", 5); printf(" CHILD: exiting
"); exit(0); } else { printf("PARENT: reading from pipe
"); read(pfds[0], buf, 5); printf("PARENT: read \"%s\"
", buf); wait(NULL); } return 0; }
別の例:
/* http://beej.us/guide/bgipc/example/pipe3.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
        int pfds[2];

        pipe(pfds);

        if (!fork()) {
                close(1);       /* close normal stdout */
                dup(pfds[1]);   /* make stdout same as pfds[1] */
                close(pfds[0]); /* we don't need this */
                execlp("ls", "ls", NULL);
        } else {
                close(0);       /* close normal stdin */
                dup(pfds[0]);   /* make stdin same as pfds[0] */
                close(pfds[1]); /* we don't need this */
                execlp("wc", "wc", "-l", NULL);
        }

        return 0;
}
このプログラムはコマンドls 124 wc-lを実行するのに相当します.