操作系统实验三、进程通信

article/2025/9/14 9:33:43

文章目录

    • 操作系统实验三、进程通信
      • 一、实验目的
      • 二、实验内容
      • 三、设计原理(或方案)及相关算法
      • 四、结果分析
      • 五、源代码

操作系统实验三、进程通信

一、实验目的

​ 1、了解和熟悉Linux支持的消息通信机制、管道道通信、共享存储区机制及信息量机制。

2、掌握利用Linux系统的进程通信机制(IPC)实现进程间交换数据的方法。

二、实验内容

​ 1、进程通信

​ 使用系统调用pipe()建立一条管道线:两个子进程P1和P2分别向管道各写一句话:

​ Child 1 is sending a message!

​ Child 2 is sending a message!

​ 父进程则从管道中读出来自两个了进程的信息,显示在屏幕上。

要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。(可以通过sleep()将自身进入睡眠)

2、 消息的创建,发送和接收.

​ (1) 使用系统调用msgget(), msgsnd(), msgsrv()及msgctl()编制一长度为1K的消息(如个人通信录信息)的发送和接收程序.

   (2) 使用共享存储区相关的系统调用 shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序.

​ (3) 比较上述两种消息通信机制中数据传输的时间。

三、设计原理(或方案)及相关算法

  1. 管道通信 创建一条管道,子进程写入数据,父进程写出数据。在父进程中使用 wait() 函数,这样在子进程执行 完毕之前,父进程一直要等待。

    调用pipe()建立一条管道,两个子进程分别向管道写入一句话,在父进程中使用wait()函数,使父进程等待子进程执行结束,依次输出P1、P2发来的消息。

  2. 消息的创建,接受和发送

    (1)消息队列通信 设计一个结构体来充当缓冲区,存储消息。之后使用msgget(), msgsnd(), msgsrv()及msgctl() 等函数来 实现消息的发送和接受。

    (2)使用shmget(),shmat(),sgmdt(),shmctl()等函数实现存储区的共享,轮流使用存储区来接收、发送消息

四、结果分析

image-20211114203951486

2.1

image-20211114204211269

2.2

image-20211114204630674

五、源代码

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>void main()
{pid_t pid_1, pid_2, fd[2];char buf[50], s[50];pipe(fd);while ((pid_1 = fork()) == -1);if (pid_1 == 0){lockf(fd[1], 1, 0);sprintf(buf, "Child 1 is sending message");write(fd[1], buf, 50);lockf(fd[1], 0, 0);exit(0);}else{while ((pid_2 = fork()) == -1);if (pid_2 == 0){lockf(fd[1], 1, 0);sprintf(buf, "Child 2 is sending message");write(fd[1], buf, 50);lockf(fd[1], 0, 0);exit(0);}else{wait(0);read(fd[0], s, 50);printf("%s \n", s);wait(0);read(fd[0], s, 50);printf("%s \n", s);exit(0);}}
}

2.1

#include<stdio.h>
#include<sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75struct msgform{long mtype;char mtext[1024];
}msg;
int msgqid,i;
void CLIENT(){int i;msgqid = msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i>=1;i--){msg.mtype=i;printf("(client)send\n");msgsnd(msgqid,&msg,1024,0);}exit(0);
}
void SERVER(){msgqid = msgget(MSGKEY,0777|IPC_CREAT);do{msgrcv(msgqid,&msg,1024,0,0);printf("(server)receive\n");}while(msg.mtype!= 1);msgctl(msgqid,IPC_RMID,0);
}int main(){if(fork()){SERVER();wait(0);} else {CLIENT();}return 0;
}

2.2

#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define SHMKEY 75int shmid ,i;
int *addr;void CLIENT(){int i;shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);addr = shmat(shmid,0,0);for(i=9;i>=0;i--){while (*addr != -1);printf("(client)send\n");*addr = i;}exit(0);
}void SERVER(){do{while ( *addr == -1);printf("(server)receive\n");if(*addr != 0)*addr = -1;}while(*addr);wait(0);shmctl(shmid,IPC_RMID,0);
}int main(){shmid = shmget(SHMKEY,1024,0777|IPC_CREAT);addr = shmat(shmid,0,0);*addr = -1;if(fork()){SERVER();wait(0);} else {CLIENT();}return 0;
}


http://chatgpt.dhexx.cn/article/oJVUP1Hl.shtml

相关文章

C++进程和Python进程通信

项目研发过程中用到了进程通信&#xff0c;由C应用程序创建共享内存及两个同步事件(Event1、Event2)&#xff0c;然后阻塞等待外部进程激活事件Event1&#xff0c;Event1激活后&#xff0c;C应用程序读取共享内存中的数据&#xff0c;完成数据解析后执行相应指令&#xff0c;并…

Linux 进程通信

Linux 进程通信 1.传统进程通信 1.1 信号 信号机制是在软件层次上对中断机制的一种模拟。 信号的捕获与处理也成为系统的“软中断”机制。 1.1.1 常用信号 每个信号都有一个编号和宏定义的名称&#xff0c;这些名字都已SIG开头。宏定义在signal.h头文件中。 1.1.2 信号的…

进程间通信

文章目录 前言1、进程间通信的目的2、管道1.1 匿名管道1.2 命名管道 3、共享内存2.1 shmget函数2.2 shmctl函数2.3 shmat函数2.4 shmdt函数 4、消息队列5、信号量 前言 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或…

【操作系统】进程通信

什么是进程通信&#xff1f;进程为什么需要通信&#xff1f; 进程通信&#xff1a;进程通信就是进程之间的信息交换。 进程通信的目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息…

【Linux】进程通信之管道通信详解

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 文章目录 一、什么是管道通信1. 管道通信是一种在进程间传递数据的方法2.看看接口&#xff1a;匿名管道和命名管道3. 管道通信的本质是什么&#xff1f; 二、管道通信的实现和深入理解1.如何…

进程通信方式总结与盘点

​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分&#xff0c;进程同步控制多个进程按一定顺序执行&#xff0c;进程通信是一种手段&#xff0c;而进程同步是目标。从某方面来讲&#xff0c;进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到…

《操作系统》实验报告——进程通信

理论知识 Linux——Linux C语言编程基础知识 Linux——进程通信 一、实验目的 (1) 熟悉并掌握管道机制&#xff0c;并实现进程间通信 (2) 熟悉并掌握共享内存机制&#xff0c;并实现进程间通信 二、实验内容 任务一&#xff1a; &#xff08;1&#xff09;阅读以上父子…

多进程通信

多进程&#xff1a; 首先&#xff0c;先来讲一下fork之后&#xff0c;发生了什么事情。 由fork创建的新进程被称为子进程&#xff08;child process&#xff09;。该函数被调用一次&#xff0c;但返回两次。两次返回的区别是子进程的返回值是0&#xff0c;而父进程的返回值则…

进程间通信详解

目录 一.进程间通信介绍 1.进程间通信的目的 2.进程间通信的本质 3.进程间通信分类 二.什么是管道 三.匿名管道 1. 匿名管道只能用于具有亲缘关系的进程之间进行通信&#xff0c;常用于父子。 2.pipe函数 3. 匿名管道的使用 4.管道的读写…

QProcess实现进程通信

QProcess实现进程通信的方式有点类似于管道。 QProcess父进程通过write来写入标准输入stdin&#xff0c;通过ReadyRead信号来接收子进程的消息。 QProcess子进程通过QFile来读取标准输入来接收父进程信息。通过QFile绑定QSocketNotifier来接收标准输入的实时信号&#xff0c;…

进程通信原理

目录 进程通信原理 1、同主机间的消息通讯机制 1.1 管道&#xff08;pipe&#xff09;,流管道(s_pipe)和有名管道&#xff08;FIFO&#xff09; 1.2 信号&#xff08;signal&#xff09; 1.3 消息队列 1.4 共享内存 信号量 套接字&#xff08;socket) 进程间通信各种方式效率比…

Linux进程通信

笔者在学习linux的过程中对linux进程通信进行记录学习。现在在 Linux 中使用较多的进程间通信方式主要有以下几种。 &#xff08;1&#xff09;管道&#xff08;Pipe&#xff09;及有名管道&#xff08;named pipe&#xff09;&#xff1a;管道可用于具有亲缘关系进程间的通信…

【Linux】进程间通信

目录 1. 进程间通信 1.1. 进程间通信的目的 1.2. 如何实现进程间通信 2. 管道通信 2.1. 匿名管道 2.1.1 创建匿名管道 2.1.2 . 深入理解匿名管道 2.2. 命名管道 2.2.1. 创建命名管道 3. system V 标准进程间通信 3.1. 共享内存 3.1.1. 实现原理 3.1.2. 代码实现 3…

认知智能理论三体论介绍简介

三体论是探索研究宇宙&#xff0c;信息和人类大脑三者关系的理论体系。是认知智能的奠基理论体系之一。宇宙和信息&#xff0c;信息和人类大脑&#xff0c;人类大脑和宇宙&#xff0c;三者之间存在着某种未被完全揭示的奥秘。三体论的核心思想体系就是基于宇宙&#xff0c;信息…

认知智能三大技术体系之类脑模型简介

认知智能三大技术体系之类脑模型简介 类脑模型是认知智能核心三大技术体系之一&#xff0c;类脑结构&#xff0c;功能机制的总称。类脑模型技术体系核心指导思想来自认知智能三大奠基理论&#xff0c;脑科学&#xff0c;心理学&#xff0c;逻辑学&#xff0c;情感学&#xff0c…

认知智能CI和人工智能AI的区别介绍简介

认知智能CI和人工智能AI的区别 人工智能和认知智能都是计算机科学的分支学科之一。人工智能是智能时代的第二个阶段&#xff0c;认知智能是智能时代的第三个阶段。认知智能也并不是智能时代发展的最终阶段&#xff0c;最终阶段应该是通用智能强智能时代。 本文主要就人工智能和…

什么是认知智能?

认知智能是计算机科学的一个分支科学&#xff0c;是智能科学发展的高级阶段&#xff0c;它以人类认知体系为基础&#xff0c;以模仿人类核心能力为目标&#xff0c;以信息的理解、存储、应用为研究方向&#xff0c;以感知信息的深度理解和自然语言信息的深度理解为突破口&#…

认知智能是什么?

认知智能是计算机科学的一个分支科学&#xff0c;是智能科学发展的高级阶段&#xff0c;它以人类认知体系为基础&#xff0c;以模仿人类核心能力为目标&#xff0c;以信息的理解、存储、应用为研究方向&#xff0c;以感知信息的深度理解和自然语言信息的深度理解为突破口&#…