Linux系统编程@进程通信(一)
进程间通信概述
需要进程通信的原因:
数据传输
资源共享
通知事件
进程控制
Linux进程间通信(IPC)发展由来
Unix进程间通信
基于System V进程间通信(System V:UNIX系统的一个分支)
POSIX进程间通信(POSIX:可移植操作系统接口,为了提高UNIX环境下应用程序的可移植性。很多其他系统也支持POSIX标准(如:DEC OpenVMS和Windows)。)
现在Linux使用的进程间通信方式包括:
管道(pipe)、有名管道(FIFO)
信号(signal)
消息队列
共享内存
信号量
套接字(socket)
管道通讯
管道:单向的、先进先出的,把一个进程的输出和另一个进程的输入连接起来。一个进程(写进程)在管道尾部写入数据,另一个进程(读进程)从管道的头部读出数据。包括无名管道和有名管道,无名管道只用于父进程和子进程间的通信,有名管道可用于运行同一系统中的任意两个进程间的通信。
管道的创建
无名管道创建
int pipe(int filedis[2]);
int pipe_fd[2];
if(pipe(pipe_fd)<0) { printf("pipe create error\n"); return -1; }
当一个管道建立时,他会创建两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。
管道的关闭
int close(); //使用close分别关闭两个文件描述符
当管道的一端被关闭后,下面两条规则起作用
1.当读(read)一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
使用无名管道通信实例
通常,进程会先调用pipe,接着调用fork(这两步为了确保只生成一个管道,且子进程生成后能够继承文件描述符),从而创建从父进程到子进程的IPC管道。
1 #include <unistd.h> 2 #include <string.h> 3 #include <sys/types.h> 4 #include <errno.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 int main() 9 { 10 int pipe_fd[2]; 11 pid_t pid; 12 char buf_r[100]; 13 char* p_wbuf; 14 int r_num; 15 16 memset(buf_r,0,sizeof(buf_r)); 17 18 /*创建管道*/ 19 if(pipe(pipe_fd)<0) 20 { 21 printf("pipe create error\n"); 22 return -1; 23 } 24 25 /*创建子进程*/ 26 if((pid=fork())==0) //子进程 27 { 28 printf("\n"); 29 close(pipe_fd[1]); //写关闭 30 sleep(2); /*为什么要睡眠*/ 31 if((r_num=read(pipe_fd[0],buf_r,100))>0) 32 { 33 printf( "%d numbers read from the pipe is %s\n",r_num,buf_r); 34 } 35 close(pipe_fd[0]); 36 exit(0); 37 } 38 else if(pid>0) //父进程 39 { 40 close(pipe_fd[0]); //读关闭 41 if(write(pipe_fd[1],"Hello",5)!=-1) 42 printf("parent write1 Hello!\n"); 43 if(write(pipe_fd[1]," Pipe",5)!=-1) 44 printf("parent write2 Pipe!\n"); 45 close(pipe_fd[1]); 46 sleep(3); 47 waitpid(pid,NULL,0); /*等待子进程结束*/ 48 exit(0); 49 } 50 return 0; 51 }
信号通讯
共享内存
消息队列
信号量
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。