操作系统原理 实验三 进程间通信

操作系统实验系列链接

注:在未加锁情况下,多进程运行结果具有不确定性,大家运行时候不用拘泥于结果
注:在未加锁情况下,多进程运行结果具有不确定性,大家运行的时候不用拘泥于结果
注:在未加锁情况下,多进程运行结果具有不确定性,大家运行的时候不用拘泥于结果

实验三 进程间通信

1、实验目的
Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是使学生了解和熟悉Linux支持的消息通讯机制及管道通信机制。
2、实验预备内容
阅读Linux系统的msg.c、sem.c和shm.c等源码文件,熟悉Linux的通信机制。
3、实验内容
(1)消息的创建,发送和接收。
①使用系统调用msgget(),msgsnd(),msgrcv(),及msgctl()等编制一长度为1k的消息的发送和接收程序。
②观察程序,说明控制消息队列系统调用msgctl()在此起什么作用?

#include<stdio.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/wait.h>

#define MSGKEY 75/*定义关键词MEGKEY*/

struct msgform/*消息结构*/
{
	long mtype;
	char mtxt[1024];/*文本长度*/
}msg;

int msgqid,i;

void CLIENT()
{
	int i;
	msgqid=msgget(MSGKEY,0777);
	for(i=10;i>=1;i--)
	{
		msg.mtype=i;
		printf("(client)sent\n");
		msgsnd(msgqid,&msg,1024,0);
		/*发送消息msg入msgid消息队列*/
	}
	exit(0);
}

void SERVER()
{
	msgqid=msgget(MSGKEY,0777|IPC_CREAT);
	/*由关键字获得消息队列*/
	do
	{
		msgrcv(msgqid,&msg,1030,0,0);
		/*从队列msgid接受消息msg*/
		printf("(server)receive\n");
	}while(msg.mtype!=1);
	/*消息类型为1时,释放队列*/
	msgctl(msgqid,IPC_RMID,0);
	exit(0);
}

int main()
{
	if(fork())
	{
		//putchar('0');
		SERVER();
	}	
	else 
	{
		//putchar('3');
		CLIENT();
	}
		
	wait(0);
	wait(0);
}

结果:

(2)编程实现进程的管道通信。
使用系统调用pipe()建立一条管道,两个子进程p1和P2分别向管道各写一句话,而父进程则从管道中读出来自于两个子进程的信息并显示在屏幕上。
①观察程序中的sleep(1)起什么作用?
②子进程1和2为什么也能对管道进行操作?

#include<unistd.h>
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int pid1,pid2;
int main()
{
	int fd[3];
	char outpipe[100],inpipe[100];
	pipe(fd);
	/*创建一个管道*/

	while((pid1=fork())==-1);
	if(pid1==0)
	{
		printf("p1\n");
		lockf(fd[1],1,0);
		sprintf(outpipe,"child1processissendingamessage!");
		/*把串放入数组outpipe中*/
		write(fd[1],outpipe,50);
		/*向管道写长为50字节的串*/
		sleep(1);/*自我阻塞1秒*/
		lockf(fd[1],0,0);
		exit(0);
	}
	else
	{
		while((pid2=fork())==-1);
		if(pid2==0)
		{
			printf("p2\n");
			lockf(fd[1],1,0);/*互斥*/
			sprintf(outpipe,"child2processissendingamessage!");
			write(fd[1],outpipe,50);
			sleep(1);
			lockf(fd[1],0,0);
			exit(0);
		}
		else
		{
			printf("parent\n");
			wait(0);/*同步*/
			read(fd[0],inpipe,50);
			/*从管道中读长为50字节的串*/
			printf("%s\n",inpipe);
			wait(0);
			read(fd[0],inpipe,50);
			printf("%s\n",inpipe);
			exit(0);
		}
	}
}

结果:
在这里插入图片描述
(3)比较上述(1),(2)两种通信机制的不同特点。

(1)消息队列方式是由消息的链表,存在内核中并由消息队列标识符标识。克服了信号传递信息少,管道只能承载无格式字节流及缓冲区大小受限的缺点。
(2)管道通信是一种半双工的通信方式,数据只能单向流动,只能在有父子进程关系的进程间使用

观察程序中的sleep(1)起什么作用?
答:延长子进程占用管道的时间,并没有让子进程1先输出而子进程2后输出的作用。

子进程1和2为什么也能对管道进行操作?
答:因为该pipe管道属于无名管道,调用pipe()的父进程及其子孙进程均能识别此文件描述符,能利用该文件(管道)进行通信。
展开阅读全文

Linux系统编程第05期:进程间通信

07-25
Linux系统提供了各种系统调用API用于进程之间的通信:     无名管道PIPE     命名管道FIFO     消息队列     共享内存     信号量     文件锁     信号signal.... 其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程间通信,比如signalfd、timerfd、eventfd等。 本视频教程为《Linux系统编程》第05期,本期课程将会带领大家学习Linux下将近15种进程间通信IPC工具的使用,了解它们的通信机制、编程实例、使用场景、内核中的实现以及各自的优缺点。 本课程会提供PDF版本的PPT课件和代码,学员购买课程后可到课程主页自行下载 嵌入式自学路线指导图: ------------------------------------------------------------------------------------------------------                    《嵌入式工程师自我修养》嵌入式自学系列教程                                           作者:王利涛 ------------------------------------------------------------------------------------------------------ 一线嵌入式工程师精心打造,嵌入式学习路线六步走:  第 1 步:Linux三剑客 零基础玩转Linux+Ubuntu Git零基础实战:Linux开发技能标配 vim从入门到精通基础篇:零基础学习vim基本命令 vim从入门到精通定制篇:使用插件打造嵌入式开发IDE makefile工程实践基础篇:从零开始一步一步写项目的Makefile makefile工程实践第2季:使用Autotools自动生成Makefile 软件调试基础理论 printf打印技巧 Linux内核日志与打印 使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境 第 2 步:C语言嵌入式Linux高级编程 第1期:C语言进阶学习路线指南 第2期:计算机架构与ARM汇编程序设计 第3期:程序的编译、链接和运行原理 第4期:堆栈内存管理 第6期:数据存储与指针 第7期:嵌入式数据结构与Linux内核的OOP思想 第8期:C语言的模块化编程 第9期:CPU和操作系统入门       搞内核驱动开发、光会C语言是不行的!       你还需要学习的有很多,包括:计算机体系架构、ARM汇编、程序的编译链接运行原理、CPU和操作系统原理、堆栈内存管理、指针、linux内核中的面向对象思想、嵌入式系统架构、C语言的模块化编程..... 第 3 步:Linux系统编程 第00期:Linux系统编程入门 第01期:揭开文件系统的神秘面纱 第02期:文件I/O编程实战 第03期:I/O缓存与内存映射 第04期:打通进程与终端的任督二脉 第05期:进程间通信-------------------we are here!‍      第 4 步:Linux内核编程‍     练乾坤大挪移,会不会九阳神功,是一道坎。搞驱动内核开发,懂不懂内核也是一道坎。 第 5 步:嵌入式驱动开发     芯片原理、datasheet、硬件电路、调试手段、总线协议、内核机制、框架流程.... 第 6 步:项目实战     嵌入式、嵌入式人工智能、物联网、智能家居...
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值