Linux pipe関数
1688 ワード
1.関数の説明
pipe(パイプの作成):1)ヘッダファイルinclude2)定義関数:int pipe(int filedes[2]);3)関数の説明:pipe()はパイプを確立し、ファイル記述記述語をパラメータfiledes配列から返す.filedes[0]はパイプ内の読取端filedes[1]はパイプの書き込み端である.4)戻り値:成功すればゼロを返し、そうでなければ-1を返し、エラーの原因はerrnoに保存されます.
エラーコード:EMFILEプロセスが使用済みのファイル描写叙述語最大量ENFILEシステムはファイル描写叙述語が使用できません.EFAULTパラメータfiledes配列アドレスが不正です.
2.例を挙げる
実行結果:
[root@localhost src]# gcc pipe.c [root@localhost src]# ./a.out This is in the child process,here read a string from the pipe. This is in the father process,here write a string to the pipe. Hello world , this is write by pipe.
パイプのデータが読み込まれると、パイプは空になります.後続のread()呼び出しは、デフォルトでブロックされ、一部のデータの書き込みを待つ.
非閉塞に設定する必要がある場合は、次のような設定を行います.
fcntl(filedes[0], F_SETFL, O_NONBLOCK); fcntl(filedes[1], F_SETFL, O_NONBLOCK);
pipe(パイプの作成):1)ヘッダファイルinclude
エラーコード:EMFILEプロセスが使用済みのファイル描写叙述語最大量ENFILEシステムはファイル描写叙述語が使用できません.EFAULTパラメータfiledes配列アドレスが不正です.
2.例を挙げる
#include <unistd.h>
#include <stdio.h>
int main( void )
{
int filedes[2];
char buf[80];
pid_t pid;
pipe( filedes );
pid=fork();
if (pid > 0)
{
printf( "This is in the father process,here write a string to the pipe.
" );
char s[] = "Hello world , this is write by pipe.
";
write( filedes[1], s, sizeof(s) );
close( filedes[0] );
close( filedes[1] );
}
else if(pid == 0)
{
printf( "This is in the child process,here read a string from the pipe.
" );
read( filedes[0], buf, sizeof(buf) );
printf( "%s
", buf );
close( filedes[0] );
close( filedes[1] );
}
waitpid( pid, NULL, 0 );
return 0;
}
実行結果:
[root@localhost src]# gcc pipe.c [root@localhost src]# ./a.out This is in the child process,here read a string from the pipe. This is in the father process,here write a string to the pipe. Hello world , this is write by pipe.
パイプのデータが読み込まれると、パイプは空になります.後続のread()呼び出しは、デフォルトでブロックされ、一部のデータの書き込みを待つ.
非閉塞に設定する必要がある場合は、次のような設定を行います.
fcntl(filedes[0], F_SETFL, O_NONBLOCK); fcntl(filedes[1], F_SETFL, O_NONBLOCK);