无名管道

无名管道
无名管道时半双工的,就是对于一个管道来讲,只能读,或者写。
无名管道只能在相关的、有共同祖先的进程间使用。
一个fork或者exec调用创建的子进程继承了父进程的文件描述符。
 
 
打开和关闭管道。

int pipe(int filedes[2]);

在你从一个管道中读出或者写入数据,这个管道必须存在。
如果成功建立了管道,则会打开两个文件描述符,并把它们的值保存在一个整数数组中。
第一个文件描述符用于读取数据,第二个文件描述符用于写入数据。
如果出错返回-1,同时设置errno
关闭一个管道用close()函数
 
 
读写管道。
读写管道与读写普通文件方式一样,调用write与read函数即可。
几乎不会在一个进程中打开一个管道仅供进程自己使用,管道是用来交换数据的。
因为一个进程已经能够访问它要通过管道共享的数据,和自己共享数据是没有意义的。
试图对一个管道的两端进行读写操作是一个严重的错误。
 
 
读写无名管道的例子。
int main(int arg, char * args[])
{
    int fd[2];char buf[100];int len;
    pipe(fd);
    memset(buf, 0, sizeof(buf));
    int pid = fork();
    if (pid == 0)
    {
        close(fd[1]);
        while((len = read(fd[0], buf, sizeof(buf))) >0)
        {
            write(STDOUT_FILENO, buf, len);
        }
        close(fd[0]);
    }
    else
    {
        close(fd[0]);
        strcpy(buf, "hello world\n");
        write(fd[1], buf, sizeof(buf));
        close(fd[1]);
        waitpid(pid, NULL, 0);
    }
    return 0;
}

 

posted @ 2015-05-12 00:24  张仕传  阅读(334)  评论(0编辑  收藏  举报