【操作系统】进程之间的通信机制

本文介绍了Linux下进程间通信的常见方式,包括管道、消息队列、共享内存,提供了相应的编程示例,如匿名管道、FIFO、共享内存的使用,以及详细阐述了如何通过管道实现多级进程通信和消息队列的有序读取。此外,还讨论了共享内存和信号量在多进程同步中的应用。
摘要由CSDN通过智能技术生成

一、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. 子进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值