无名管道
无名管道
无名管道时半双工的,就是对于一个管道来讲,只能读,或者写。
无名管道只能在相关的、有共同祖先的进程间使用。
一个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; }