C言語,pipe()関数でパイプを生成する

スポンサーリンク

鍛錬 814

C言語,pipe()関数でパイプを生成する

パイプを生成するには、pipe()関数を使用します。
 
以下は、pipe()関数についてです。

#include <unistd.h>

int pipe(int pipefd[2]);
 

 
配列 pipefd[2] における、パイプの読み込み側と書き込み側は、以下に示す通りです。

読み込み側 書き込み側
pipefd[0] pipefd[1]

pipefd[1] に書き込まれたデータは、パイプから読み込まれるまでバッファリングされます。

引数

以下は、上記の引数についてです。

引数 意味
int pipefd[2] パイプの読み込み側と書き込み側を参照する、
ファイルディスクリプタが格納される配列

戻り値

以下は、戻り値についてです。

戻り値
int 成功 0
int エラー -1
 
スポンサーリンク

プログラム

以下は、書き込み側のパイプに文字列を書き込み、読み込み側のパイプから文字列を読み込むプログラム、test_pipe.c です。

今回は、文字列として「ABC」(3バイト)を使用しています。

// include
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

// main
int main(void)
{
	char data[256] = "";
	char rbuf[256]  = "";
	int pipes[2];
	int ret;
	size_t st_len;
	ssize_t sst_ret;
	
	// パイプ生成
	ret = pipe(pipes);
	if (ret == -1) {
		perror("pipe");
		exit(EXIT_FAILURE);
	}
	
	// パイプへ書込む文字列を格納
	strncpy(data, "ABC", sizeof(data) - 1);
	
	// パイプへ書込
	st_len = strlen(data);
	sst_ret = write(pipes[1], data, st_len);
	if (sst_ret == -1) {
		perror("write");
		exit(EXIT_FAILURE);
	}
	else if ((sst_ret >= 0) && ((size_t)sst_ret != st_len)) {
		printf("ERROR,write(),ret=%ld\n", sst_ret);
		exit(EXIT_FAILURE);
	}
	printf("パイプへ書き込んだ文字列 --> %s (%ld byte)\n", data, sst_ret);
	
	// パイプから読込
	sst_ret = read(pipes[0], rbuf, sizeof(rbuf) - 1);
	if (sst_ret == -1) {
		perror("read");
		exit(EXIT_FAILURE);
	}
	rbuf[sst_ret] = '\0';
	printf("パイプから読み込んだ文字列 --> %s (%ld byte)\n", rbuf, sst_ret);
	
	return 0;
}

実行結果

以下は、プログラム test_pipe.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_pipe.c -o test_pipe
***@ubuntu:~/***/test/c$ ./test_pipe
パイプへ書き込んだ文字列 --> ABC (3 byte)
パイプから読み込んだ文字列 --> ABC (3 byte)

 
上記に示した通り、パイプを生成して書き込みと読み込みを行うことができました。

スポンサーリンク

シェアする

フォローする