Linux进程间通信方式汇总
目前已包含的方式
1. 管道(PIPE) 无名管道 优: 简单,传输速度快 缺:只能用作于亲缘关系进程的通信,单向
2. FIFO(有名管道) 优: 可以用作非亲缘关系进程的通信, 缺: 传输慢 ,不能存存储数据 ,传输量小 ,只能一对一
3. XSI消息队列 优: 数据控制好,先来的先处理,可以做优先级,也可以用作非亲缘进程的通信 缺: 不能做大量数据处理的通信,速度慢 ,比如可以传输命令
4. XSI信号量 不适用于进程间的通信, 可用于进程间的同步,解决生产者与消费者之间的逻辑
5. XSI共享内存
6. POSIX信号量
7. 域套接字(Domain Socket)
8. 信号(Signal)
9. 互斥量(Mutex)
10. sendmsg
1.pipe(int *pipe_fd); 主进程创建管道文件,fork()后父子进程都继承了该文件索引可以指向管道文件,父子进程各关闭一个句柄,父进程往pipe_fd[1]写,子进程从pipe_fd[0]读 ,pipe虽然是一个文件, 但是是一个特殊文件存在于内存中,不具备存储功能(只具有数据流通性,不具备数据缓冲性 ,如果没读完就关闭写端,pipe则会一次性把全部数据发送给读端) ,如果父子进程各占一个的fd其中一个关闭了,那么进程会发出一个sigpipe信号另一端也将自动关闭, 管道两端 write read都会返回--1,
#include<stdio.h> #include<errno.h> #include<sys/wait.h> #include<unistd.h> #include<string.h> #include<sys/types.h> int main() { int pipe_fd[2] = {-1,-1}; if(pipe(pipe_fd) < 0){ printf("pipe error, %s ",strerror(errno)); return 1; } pid_t id = fork(); if(id == 0){ //child write close(pipe_fd[0]); char *msg = "child write:enenshiwo "; while(1){ write(pipe_fd[1],msg,strlen(msg)); sleep(1); } }else{ //father read close(pipe_fd[1]); char buf[1024]; while(1){ buf[0] = '