目录
进程间通信:IPC
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等,其中Socket和Streams支持不同主机上的两个进程IPC。
一、管道
管道,通常指无名管道,是UNIX系统IPC最古老的形式
1、管道特点:
(1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
(2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)
(3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数,但是它 不是普通的文件,并不属于其他任何文件系统,并且只存在内存中
(4)同一时间,数据只能是单向的(只能一个写一个读)
(5)管道中的数据,读走就没了
(1)无名管道
#include <unistd.h>
int pipe(int fd[2]) //返回值:若成功返回0,若失败返回-1
当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开,
要关闭管道只需要将这两个文件描述符关闭即可
无名管道代码如下:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(){
int fd[2];
int pid;
char *buf = "hello from father";
char readBuf[1024] = {0};
if(pipe(fd) == -1){ //创建一个管道
printf("creat pipe failed\n");
}
pid = fork(); //创建一个父子进程
if(pid < 0){
printf("creat pid failed\n");
}else if(pid > 0){
printf("this is father\n");
close(fd[0]); //关闭读端
write(fd[1],buf,strlen(buf));
wait(); //等待子进程的返回值
}else{
printf("this is child\n");
close(fd[1]); //关闭写端
read(fd[0],readBuf,strlen(buf));