Linux进程间通信
1.什么是IPC
interprocess communication
进程间通信
2.进程间通信的四种方式
a.管道-------简单
b.信号-------系统开销小
c.共享映射区
d.套接字
3.管道(匿名)
本质:内核的缓冲区—伪文件(不占用磁盘空间)
特点:
两部分
读端 ---------- 写端------对应两个文件描述符
数据写端流入,读端流出
原理:队列
环形队列
FIFO
4.创建匿名管道
int pipe(int fd[2])
实现一个父子进程间的通信,结合了一下所学知识
execlp() ----更换子进程的代码块
fork()----------生出子进程
wait()----------回收进程中的子进程
dup2-----------实现标准输入输出重定向
pipe()----------创建一个管道
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
int fd[2];
int ret=pipe(fd);
pid_t pid=fork();
if(pid>0) {
//输出重定向,父进程执行 ps aux操作
int STDOUT_FILEON;
dup2(fd[1],STDOUT_FILEON);
//关闭读操作
close(fd[0]);
execlp("ps","ps","aux",NULL);
}
else if(pid==0) {
//输入重定向
int STDIN_FILEON;
dup2(fd[0],STDIN_FILEON);
//关闭写操作
close(fd[1]);
execlp("grep","grep","weihang","--color=auto",NULL);
}
return 0;
}
5.管道的读行为
有数据的情况下:正常读取,返回读出的字节数
无数据的情况下:写端全部关闭,read解除阻塞,返回0.
6.管道的写行为
①读端全部关闭
管道破裂,进程被终止
②读端没有全部关闭
往缓冲区写
有名管道fifo(first in first out)
1.特点
有名管道
伪文件,在磁盘大小永远为0
在内核有一个对应的缓冲区
2.使用场景
没有血缘关系的进程间通信
3.创建方式
命令:mkfifo + 管道名