Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Linux 进程间通讯之创建无名管道和读写无名管道

Linux进程间通讯的方式:1. 管道(pipe)和有名管道(FIFO).
2. 信号(signal)
3. 消息队列
4. 共享内存
5. 信号量
6. 套接字(socket) 管道通讯:无名管道:由pipe()函数创建,int pipe(int  filedis[2]), 当管道建立时有两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。关闭管道,仅需将两个文件描述符关闭即可。创建无名管道pipe():#include <unistd.h>#include <stdio.h> int main(){       intpipe_filed[2];       if(pipe(pipe_filed)<0){                 printf("pipecreate failed. ");                 return-1;       }       else{                 printf("pipecreate successfully. ");                  close(pipe_filed[0]);                            //关闭相应读管道(必须要)                 close(pipe_filed[1]);                            //关闭相应写管道(必须要)       }}注:fork()必须在pipe()之前来创建子进程,否则子进程无法进程相应的文件描述符,如果在fork之后,那么fork会在子/父进程各执行一次,属不同的管道。读写无名管道示例:#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/wait.h> int main(){       charcache[100];       intfiledis[2];       if(pipe(filedis)< 0){                 printf("Createpipe failed. ");                 return-1;       }       memset(cache,0, sizeof(cache));            //在一段内存块中填充某个特定的值,此为,对cache数组以0进行填充        intpid;       pid= fork();                                            // 创建子进程       if(pid== 0){                                            //   进入子进程                 printf("Inchild process. ");                 close(filedis[1]);                          //   关闭写管道                 sleep(3);                                        //   等待,为了等父进程写入东西                 read(filedis[0],cache, 100);   //   读管道,并将内容写入cache之中                 printf("%s. ",cache);              //   打印cache内容                 close(filedis[0]);                          //   关闭读管道       }       elseif(pid > 0){                           //   进入父进程                 printf("Inparent process. ");                 close(filedis[0]);                          //   关闭读管道                 write(filedis[1],"Hello ",6);   //   第一次写入                 write(filedis[1],"linuxdba", 8);       //   第二次写入                 close(filedis[1]);                          //   关闭写管道                 wait(NULL);                                  //   等待子进程退出再往下执行       }       else{                 printf("Createchild process failed. ");                 return-1;       }       return0;}