IPC(进程间通信)

时间:2022-07-11 19:05:55

常用IPC有:

1:管道 

2:命名管道(FIFO)

3:共享存储

4:套接字

5:信号量

6:消息队列

7:信号

管道 只允许亲缘进程间的通讯。

命名管道(FIFO) 除了亲缘进程可以通讯外,非亲缘进程也可以通讯。

共享内存 多个进程可以访问同一块内存空间,是最快的IPC方式。在进程间传递数据时无须任何内存的拷贝 。可以在亲缘和非亲缘的进程间使用。

套接字 最通用的进程间通讯方式,它提供了一种让不同机器上进程间通讯方式。 消息队列 可以用在非亲缘关系的进程之间使用

信号量(semaphore) 主要是线程间和亲缘和非亲缘的进程间的同步手段,不做数据传输之用。

消息队列 可以用在非亲缘关系的进程之间使用

信号(signal) 亲缘进程和非亲缘进程都可以, 也可以进程自己给自己递送信号。

命名管道程序:

 1 int main()
 2 {
 3     pid_t pid;
 4     int fd[2];
 5     char line[100];
 6     if(pipe(fd)<0)
 7     {
 8         printf("pipe error\n");
 9     }
10     if((pid = fork())<0)
11     {
12         printf("fork error\n");
13     }
14     else if(0 == pid)
15     {
16         close(fd[1]);
17         read(fd[0],line,11);
18         printf("%s",line);
19         exit(0);
20     }
21     else
22     {
23         close(fd[0]);    
24         write(fd[1],"hello word\n",11);
25     }
26 }

 

共享存储允许两个或多个进程共享一给定的存储区。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种I P C。使用共享存储的唯一窍门是多个进程之间对一给定存储区的同步(互斥访问)存取。若服务器将数据放入共享存储区,则在服务器做完这一操作之前,客户机不应当去取这些数据,

通常,信号量(无亲缘关系的进程间)被用来实现对共享存储存取的同步。

void* mmap ( void * addr , size_t length , int prot , int flags , int fd , off_t offset ) mmap在进程地址空间创建一个映射。它既可以把一个文件映射到内存,也可以映射一块内存,实现进程间内存共享。

一旦创建了一个共享存储段,进程就可调用shmat将其连接到它的地址空间中