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.例を挙げる
#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);