管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
| 1 2 | #include <unistd.h>intpipe(intfd[2]) | 
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
从管道中读取数据:
关于管道的读规则验证:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /************** * readtest.c * **************/#include <unistd.h>#include <sys/types.h>#include <errno.h>main(){    intpipe_fd[2];    pid_t pid;    charr_buf[100];    charw_buf[4];    char* p_wbuf;    intr_num;    intcmd;        memset(r_buf,0,sizeof(r_buf));    memset(w_buf,0,sizeof(r_buf));    p_wbuf=w_buf;    if(pipe(pipe_fd)<0)    {        printf("pipe create error\n");        return-1;    }        if((pid=fork())==0)    {        printf("\n");        close(pipe_fd[1]);        sleep(3);//确保父进程关闭写端          r_num=read(pipe_fd[0],r_buf,100);          printf(   "read num is %d   the data read from the pipe is %d\n",r_num,atoi(r_buf));                close(pipe_fd[0]);        exit();    }    elseif(pid>0)    {    close(pipe_fd[0]);//read    strcpy(w_buf,"111");    if(write(pipe_fd[1],w_buf,4)!=-1)        printf("parent write over\n");    close(pipe_fd[1]);//write        printf("parent close fd[1] over\n");    sleep(10);    }   } /************************************************** * 程序输出结果: * parent write over * parent close fd[1] over * read num is 4   the data read from the pipe is 111 * 附加结论: * 管道写端关闭后,写入的数据将一直存在,直到读出为止. ****************************************************/ | 
向管道中写入数据:
对管道的写规则的验证1:写端对读端存在的依赖性
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <unistd.h>#include <sys/types.h>main(){    intpipe_fd[2];    pid_t pid;    charr_buf[4];    char* w_buf;    intwritenum;    intcmd;        memset(r_buf,0,sizeof(r_buf));    if(pipe(pipe_fd)<0)    {        printf("pipe create error\n");        return-1;    }        if((pid=fork())==0)    {        close(pipe_fd[0]);        close(pipe_fd[1]);        sleep(10);          exit();    }    elseif(pid>0)    {    sleep(1);  //等待子进程完成关闭读端的操作    close(pipe_fd[0]);//write    w_buf="111";    if((writenum=write(pipe_fd[1],w_buf,4))==-1)        printf("write to pipe error\n");    else        printf("the bytes write to pipe is %d \n", writenum);        close(pipe_fd[1]);    }   } | 
原文:http://www.cnblogs.com/bracken/p/3642086.html