目录
一、进程间通信介绍
概念:就是进程和进程之间交换信息。
常用通信方式
无名管道(pipe)
有名管道 (fifo)
信号(signal)
共享内存(mmap)
套接字(socket)
过时的IPC通信方式
System V IPC
共享内存(share memory)
消息队列(message queue)
信号灯集(semaphore set)
二、无名管道
![](https://img-blog.csdnimg.cn/34d84e45121a48839225c8209d8b6d17.png)
无名管道具有如下特点:
只能用于具有亲缘关系的进程之间的通信
单工的通信模式,具有固定的读端和写端
无名管道创建时会返回两个文件描述符,分别用于读写管道
1、无名管道创建 - pipe
#include <unistd.h>
int pipe(int pfd[2]);
成功时返回0,失败时返回EOF 设置errno
pfd 包含两个元素的整形数组,用来保存文件描述符
pfd[0]用于读管道;pfd[1]用于写管道
无名管道注意事项:
1. 只能用于亲缘关系的进程间通信(父子进程,兄弟进程)
2. 管道通信是单工的,一端读,一端写(程序实现设计好)。
3. 数据自己读不能自己写
4. 管道可以用于大于2个进程共享
pipe_e.c:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
int pfd[2];
int re;
char buf[20]={0};
pid_t pid;
re = pipe(pfd);
if(re<0){
perror("pipe");
return 0;
}
printf("%d,%d\n",pfd[0],pfd[1]);
pid = fork();
if(pid<0){
perror("fork");
return 0;
}else if(pid>0){
//close(pfd[0]);
while(1){
strcpy(buf,"hhahahahah");
write(pfd[1],buf,strlen(buf));
sleep(1);
}
}else{
close(pfd[1]);
while(1){
re=read(pfd[0],buf,20);
if(re>0){
printf("read pipe=%s\n",buf);
}
}
}
}
结果:
管道可以用于大于两个进程共享,举例:两个写,一个读,pipe2_t.c:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
int pfd[2];
int i;
int re;
char buf[40]={0};
pid_t pid;
re = pipe(pfd)