进程间通信IPC的原理:
常见的进程间通信方式有:
- 管道(使用最简单)
- 信号(开销最小)
- 共享映射区(无血缘关系)
- 本地套接字(最稳定)
二、管道的特质与基本用法
内核借助环形队列机制,使用内核缓冲区实现,血缘关系间进程可用
创建并打开管道:int pipe(int pipefd[2]);
参数分别是读写,pipefd[0]是读端,pipefd[1]是写端,成功返回0,失败返回-1
例子:创建管道时父子进程的读写通道都打开,那么fork子进程后,子进程也拥有父进程的读写通道,如图
但是管道数据是单向流动的,因此一端读的话一端写,我们就将父进程的读端关闭,将子进程的写端关闭:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<pthread.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
int ret;//接收创建管道的函数的返回值
int fd[2];
char *str = "hello pipe"
char buf[1024];
ret = pipe(fd);
if(ret == -1)
sys_err("pipe error");
pid = fork();//创建子进程
if(pid>0)//父进程
{
close(fd[0]);//父进程关闭读端
write(fd[1],str, strlen(str));//父进程往管道中写数据
close(fd[1]);
}else(pid == 0)//子进程
{
close(fd[1]);//子进程关闭写端
//子进程去读
ret = read(fd[0], buf, sizeof(buf));
write(STDOUT_FILENO, buf, ret);
close(fd[0]);
}
}