プロセス間通信(fork,pipe)

プロセス間通信により通信を行う例です.今回の例では,親子プロセス間でのメッセージの送受信を行っています.

注意として,親から子へメッセージを送信する場合には,親側の送信の最後にファイルディスクリプタを閉じなければ(close(pipe_fd[1]); の部分),子側の受信が完了せず,プロセスが終了しない点に注意して下さい.子側はプロセスの終了とともにファイルディスクリプタが閉じられ,親側の受信の受信が完了します.

プロセス間通信--親から子へ(fork,pipe)(list_72-1.c)
#include <stdio.h>

int pipe_fd[2];

void do_parent()
{
    int  status;
    char *p="Hello, my kid.";

    printf("this is parent.\n");

    close(pipe_fd[0]);
    while(*p){
        if(write(pipe_fd[1],p,1) < 0){
            perror("write");
            exit(1);
        }
        p++;
    }
    // 通信の終了を子プロセスに通知
    //  --> なければ read が待ち状態のままとなる
    close(pipe_fd[1]);

    if(wait(&status) < 0){
        perror("wait");
        exit(1);
    }
}

void do_child()
{
    int i,c;
    
    printf("this is child.\n");
    
    close(pipe_fd[1]);
    while((i=read(pipe_fd[0],&c,1)) > 0){
        putchar(c);
    }
    putchar('\n');
    close(pipe_fd[0]);
}

int main()
{
    int child;

    if(pipe(pipe_fd) < 0){
        perror("pipe");
        exit(1);
    }

    if((child = fork()) < 0){
        perror("fork");
        exit(1);
    }

    if(child) do_parent();
    else      do_child();

    return 0;

}

実行結果
this is parent.
this is child.
Hello, my kid.

プロセス間通信--子から親へ(fork,pipe)(list_72-2.c)
#include <stdio.h>

int pipe_fd[2];

void do_parent()
{
    int i,c,status;
    
    printf("this is parent.\n");
    
    close(pipe_fd[1]);
    while((i=read(pipe_fd[0],&c,1)) > 0){
        putchar(c);
    }
    putchar('\n');
    close(pipe_fd[0]);
    
    if(wait(&status) < 0){
        perror("wait");
        exit(1);
    }
}

void do_child()
{
    char *p="Hello, my parent.";

    printf("this is child.\n");

    close(pipe_fd[0]);
    while(*p){
        if(write(pipe_fd[1],p,1) < 0){
            perror("write");
            exit(1);
        }
        p++;
    }

    // 通信の終了を子プロセスに通知
    close(pipe_fd[1]);
    // →子プロセスはプロセスの終了とともにディスクリプタを
    // 閉じるためなくてもよい
}

int main()
{
    int child;

    if(pipe(pipe_fd) < 0){
        perror("pipe");
        exit(1);
    }

    if((child = fork()) < 0){
        perror("fork");
        exit(1);
    }

    if(child) do_parent();
    else      do_child();

    return 0;
}

実行結果
this is parent.
this is child.
Hello, my parent.
inserted by FC2 system