名前なしパイプ(1)

パイプを生成する.
成功した場合は 0
失敗した場合は -1(EOF)

#include<unistd.h>
int pipe(int pipefd[2]);
                        
次のプログラムは, 読み書きするパイプを生成し, pipe[1]にmsgを書き込み,
pipe[0]で読み込んだmsgをbuffに格納する.
                        /* pipe1.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>

void closepipe(int *pipe);

int main(int argc, char **argv)
{
    int pp[2];
    char *msg = "This is pipe Massage.\n";
    char buff[BUFSIZ];

    if(pipe(pp) == EOF) {
        perror("pipe");
        exit(1);
    }

    if(write(pp[1], msg, strlen(msg) + 1) == EOF) {
        perror("write");
        closepipe(pp);
        exit(1);
    }

    if(read(pp[0], buff, BUFSIZ) == EOF) {
        perror("read");
        closepipe(pp);
        exit(1);
    }

    printf("message: %s\n", buff);

    return 0;
}

void closepipe(int *pipe) {
    close(pipe[0]);
    close(pipe[1]);
}

$ ./pipe1
message: This is pipe Message.


pipe example

子プロセスから受け取ったメッセージを, パイプを通じて親プロセスに通信するプログラム.

/* pipe2.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>

#define BUFFSIZE 4096

void closepipe(int *pp);

int main(int argc, char **argv)
{
    int pp[2];
    int n, status;
    char *msg = "Fork Message\n";
    char buff[BUFFSIZE];
    pid_t pid;

    if(pipe(pp) == EOF) {
        perror("pipe");
        exit(1);
    }

    if((pid = fork()) == EOF) {
        perror("fork");
        closepipe(pp);
        exit(1);
    }

    if(pid == 0) {
        close(pp[0]);
        printf("(PID:%d): CHILD PROCESS\n", getpid());
        printf("Writting Message for Pipe...\n\n");
        if(write(pp[1], msg, strlen(msg) + 1) == EOF) {
            perror("write");
            closepipe(pp);
            exit(1);
        }
    }

    else {
        waitpid(pid, &status, 0);
        close(pp[1]);
        if(read(pp[0], buff, BUFFSIZE) == EOF) {
            perror("read");
            close(pp[0]);
            exit(1);
        }
        printf("(PID:%d): Mother Process\n", getpid());
        printf("message: %s\n", buff);
        close(pp[0]);
    }

    return 0;
}

void closepipe(int *pp) {
    close(pp[0]);
    close(pp[1]);
}

                            
実行例

$ ./pipe2
(PID:10952): CHILD PROCESS
Writting Message for Pipe...

(PID:10951): Mother Process
message: Fork Message