一、Linux进程间通信:管道、消息队列、共享内存;
进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源。
所以进程需要一些手段来进行进程间数据传递、同步与异步的机制。
====================================================================================
① 管道
② 消息队列
③ 共享内存
=============================================================================
二、编写程序实现匿名管道、FIFO、共享内存、消息队列的通信示例
① 匿名管道
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
int main(){
pid_t pid;
char buf[128];//发送的消息
int fds_f[2];//子进程联系父进程管道 fds_f[0]读 fds_f[1]写
int fds_c[2];//父进程联系子进程管道 fds_c[0]读 fds_c[1]写
pipe(fds_f);//给fds_f数组建立管道
pipe(fds_c);//给fds_c数组建立管道
pid = fork();//生成子进程
if(pid){//父进程
printf("1. 这里是父进程\n");
strcpy(buf,"来自父进程的信息。");
write(fds_c[1],buf,sizeof(buf));//父进程向子进程发送消息
read(fds_f[0],buf,sizeof(buf));//接收来自子进程的消息
printf("1. 父进程收到消息:%s\n",buf);
}
else if(pid==0){//子进程
sleep(1);//休眠1秒
printf("2. 这里是子进程\n");
strcpy(buf,"来自子进程的信息。");
write(fds_f[1],buf,sizeof(buf));//子进程向父进程发送消息
read(fds_c[0],buf,sizeof(buf));//接收来自父进程的消息
printf("2. 子进程收到消息:%s\n",buf);
}
}
1编号代表父进程,2编号代表子进程。子进程休眠1秒。所以父进程发送消息给子进程,子进程立刻收到父进程信息,输出后,发送消息给父进程。
====================================================================================
② FIFO
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
int main(){
pid_t pid;
char buffer[80];//传输的信息
int fd;//操作编号
char *FIFO = "fifo1";//FIFO有名管道文件名称
mkfifo(FIFO,0666);//创建有名管道文件
pid = fork();
if(pid){//父进程
printf("1. 父进程。\n");
//将“来自父进程的信息”复制给buffer
strcpy(buffer,"来自父进程的信息。");
fd = open(FIFO,O_WRONLY);//打开管道文件,只写
write(fd,buffer,sizeof(buffer));//往管道文件中写入信息
close(fd);//关闭管道文件
fd = open(FIFO,O_RDONLY);//打开管道文件,只读
sleep(1);//沉睡一秒钟
read(fd,buffer,sizeof(buffer));//读取管道文件的信息
printf("1. 父进程收到信息 :%s\n",buffer);
close(fd);//关闭管道文件
}
else if(pid==0){//子进程
printf("2. 子进程。\n");
fd = open(FIFO,O_RDONLY);//打开管道文件,只读
read(fd,buffer,80);//读取管道文件的信息
printf("2. 子进程