C言語システムコール-pipe

pipeシステムコール

概要

pipeはパイプ生成し、入力及び出力に対するファイルディスクリプタを割り当てます。


パイプは、入力側パイプにデータを書き込むと、同一のデータが出力側パイプから読み出すことができます。

パイプを作成した後で子プロセスを生成すると、パイプは親子プロセス間で共有された状態になります。

pipeとforkを利用することでパイプによるプロセス間通信が実現できます。


pipeの引数にはファイルディスクリプタを格納するための要素数2の配列を渡します。

fd[2]と定義した場合には、fd[0]が読み込み側のディスクリプタとなり、fd[1]が書き込み側のディスクリプタとなります。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>

/*!
 * @brief     パイプを作成する。
 * @return    0:success/-1:failure
 */
static int
create_pipe(void)
{
    int rc = 0;
    int fd[2] = {0};
    pid_t pid = {0};
    char buf[BUFSIZ] = {"\0"};

    rc = pipe(fd);
    if(rc < 0){
        printf("Error: pipe() %s\n", strerror(errno));
        return(-1);
    }

    pid = fork();
    if(pid < 0){
        printf("Error: fork() %s\n", strerror(errno));
        return(-1);
    }

    /* パイプの不要ディスクリプタを閉じる */
    if(pid == 0){
        close(fd[0]);
    }else{
        close(fd[1]);
    }

    /* 子プロセスから書き込み、親プロセスで受け取る */
    if(pid == 0){
        write(fd[1], "pipe() sample\n", 14);
        _exit(0);
    }else{
        rc = read(fd[0], buf, sizeof(buf));
        write(1, buf, rc);
    }

    return(0);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 1){
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = create_pipe();
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ