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 }
View Code

 

 

信号通讯


 

 

 

共享内存


 

 

 

 

消息队列

 


 

 

 

信号量


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。