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