管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe)。# include <unistd.h>int pipe(int filedes[2]); //创建管道
pipe()说明:返回值:0成功,-1出错。如果调用成功,则进程此时由了两个额外的打开文件描述符,filedes[0]中的值是管道的读取端,而filedes[1]是管道的写入端。#include<unistd.h>#include<sys/types.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>int main(){ int pipe_fd[2]; pid_t pid; char buf_r[100]; char *p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r)); //创建管道 if(pipe(pipe_fd)<0){ printf("pipe create error/n"); return -1; } if((pid=fork())==0){//表示在子进程中 printf("/n"); //关闭管道写描述符,进行管道读操作 close(pipe_fd[1]); sleep(2); //管道描述符中读取 if((r_num=read(pipe_fd[0],buf_r,100))>0){ printf("%d numbers read from the pipe is %s/n",r_num,buf_r); } close(pipe_fd[0]); exit(0); } else if(pid>0){ //表示在父进程中,父进程写 //关闭管道读描述符,进行管道写操作 close(pipe_fd[0]); if(write(pipe_fd[1],"Hello",5)!=-1) printf("parent write1 success!/n"); if(write(pipe_fd[1],"Pipe",5)!=1) printf("parent write2 success!/n"); close(pipe_fd[1]); sleep(3); waitpid(pid,NULL,0); exit(0); }} 管道读写注意事项:1.必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符;2.当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。
转载声明: 本文转自
======================================================================
扩展参考:
命名管道FIFO——Linux笔记
信号——Linux学习笔记
守护进程——Linux学习笔记
共享内存——Linux学习笔记