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); }