操作系统课设之Linux 进程间通信

2023-10-26

前言

课程设计开始了,实验很有意思,写博客总结学到的知识
白嫖容易,创作不易,学到东西才是真
本文原创,创作不易,转载请注明!!!
本文链接
个人博客:https://ronglin.fun/archives/175
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/118308512

为了美观,实验源代码在结尾处,整合版见下
链接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取码:Lin2
操作系统课程设计源代码
本次操作系统课程设计合集
操作系统课设之Windows 进程管理
操作系统课设之Linux 进程管理
操作系统课设之Linux 进程间通信
操作系统课设之Windows 的互斥与同步
操作系统课设之内存管理
操作系统课设之虚拟内存页面置换算法的模拟与实现
操作系统课设之基于信号量机制的并发程序设计
操作系统课设之简单 shell 命令行解释器的设计与实现
仅用于学习,如有侵权,请联系我删除

实验题目

Linux 进程间通信

实验目的

Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据,通过本实验,理解熟悉 Linux 支持的消息通信机制。

实验内容

实验原理:主要用到4个函数

int msgget(key_t key, int msgflag);

key:某个消息队列的名字,用ftok()产生 (函数ftok的返回值)或IPC_PRIVATE,获取消息队列的标识符,创建和访问一个消息队列。

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msqid:消息队列标识符,由msgget获得;
cmd:控制标识符,IPC_SET 命令:设置属主的用户标识符和组标识符,IPC_STAT 和 IPC_INFO 命令:获得资源状态信息,IPC_RMID 命令:释放这个资源;
buf:消息队列管理结构体,请参见消息队列内核结构说明部分。

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

msqid:消息队列标识符;
msgp:发送给队列的消息。msgp可以是任何类型的结构体,但第一个字段必须为long类型,即表明此发送消息的类型,msgrcv根据此接收消息。msgp定义的参照格式如下:

    struct s_msg{ /*msgp定义的参照格式*/
     long type; /* 必须大于0,消息类型 */
           char mtext[256]; /*消息正文,可以是其他任何类型*/
    } msgp;

msgsz:要发送消息的大小,不含消息类型占用的4个字节,即mtext的长度;
msgflg:控制位,规定当核心用尽内部缓冲空间时应执行的动作

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

msqid:消息队列标识符;
msgp:存放消息的结构体,结构体类型要与msgsnd函数发送的类型相同;
msgsz:要接收消息的大小,不含消息类型占用的4个字节;
msgtyp:0:接收第一个消息;>0:接收类型等于msgtyp的第一个消息;<0:接收类型等于或者小于msgtyp绝对值的第一个消息;
msgflg:规定倘若该队列无消息,核心应当做什么事,如果此时设置了 IPC_NOWAIT 标志,则
立即返回,若在 flag 中设置了 MSG_NOERROR,且所接收的消息大小大于 size ,核心截断所接收的消息。
msgrcv()解除阻塞的条件有以下三个:
1.消息队列中有了满足条件的消息。
2.msqid代表的消息队列被删除。
3.调用msgrcv()的进程被信号中断。
用以上4个函数实现Linux系统下的通信。

实验步骤:
在Linux虚拟机下,用codeblocks新建一个project,将指导书的代码copy到main.cpp文件下,多次运行查看结果。
关键代码如下:

#define MSGKEY 75
struct msgform
{
    long mtype;
    char mtext[1030];
} 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);
    }
    exit(0);
}
void SERVER()
{
    msgqid=msgget(MSGKEY,0777|IPC_CREAT);
    do
    {
        msgrcv(msgqid,&msg,1030,0,0);
        printf("(Server) recieved\n");
    }
    while(msg.mtype!=1);
    msgctl(msgqid,IPC_RMID,0);
    exit(0);
}
int main()
{
    while((i=fork())==-1);
    if(!i) SERVER();
    while((i=fork())==-1);
    if(!i) CLIENT();
    wait(0);wait(0);
    return 0;
}

四、实验结果与分析
运行结果如下:
在这里插入图片描述
多次结果运行结果均为上,只有极少数运行结果是client发送一条server接受一条。
对于以上结果,查阅资料可知:
message的传送和控制并不保证完全同步,当一个程序不再激活状态的时候,它完全可能继续睡眠,造成上面现象,在多次send message后才receive message.这一点有助于理解消息转送的实现机理。
消息通信的特点:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。消息的传递,自身就带有同步的控制.当等到消息的时候,进程进入睡眠状态,不再消耗CPU资源。

小结与心得体会

由于main函数两次fork(),最开始我认为server也会fork()出client子进程,也就是,我认为作为子进程的server还会生成”孙”进程,但是多次运行调试后,结果并不是我想的那样,单步调试加测试输出之后,我发现了 exit(0),它在子函数里边,也就是说在执行完server()/client()子函数之后,子进程直接结束,不再返回main()函数。
对于Linux进程通信,之前了解的比较少,只是听说过管道的概念。这次验证实验了解了Linux进程间通信的基本方法,获益匪浅。
=w=

源代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <unistd.h>
#include<sys/wait.h>
#define MSGKEY 75
struct msgform
{
    long mtype;
    char mtext[1030];
} msg;
int msgqid,i;
void CLIENT()
{
    int i;
    //flag 本身由操作允许权和控制命令值相“或”得到。
    msgqid=msgget(MSGKEY,0777);
    for (i=10; i>=1; i--)
    {
        msg.mtype=i;
        printf("(client) sent \n");
        //flag 规定当核心用尽内部缓冲空间时应执行的动作
        msgsnd(msgqid,&msg,1024,0);
    }
    exit(0);
}
void SERVER()
{
    //IPC_CREAT | 0400 是否该队列应被创建;
    msgqid=msgget(MSGKEY,0777|IPC_CREAT);
    do
    {
        //type 是用户要读的消息类型:
        msgrcv(msgqid,&msg,1030,0,0);
        printf("(Server) recieved\n");
    }
    while(msg.mtype!=1);
    msgctl(msgqid,IPC_RMID,0);
    exit(0);
}
int main()
{
    while((i=fork())==-1);
    if(!i)
        SERVER();
    while((i=fork())==-1);
    if(!i)
        CLIENT();
    wait(0);
    wait(0);
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统课设之Linux 进程间通信 的相关文章

  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 如何确定代码是否在信号处理程序上下文中运行?

    我刚刚发现有人正在从信号处理程序调用我编写的绝对不是异步信号安全的函数 所以 现在我很好奇 如何避免这种情况再次发生 我希望能够轻松确定我的代码是否在信号处理程序上下文中运行 语言是 C 但该解决方案不适用于任何语言吗 int myfunc
  • 在 Docker 容器中以主机用户身份运行

    在我的团队中 我们在进行开发时使用 Docker 容器在本地运行我们的网站应用程序 假设我正在开发 Flask 应用程序app py具有依赖关系requirements txt 工作流程大致如下 I am robin and I am in
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 了解 Linux oom-killer 日志

    我的应用程序被 oom killer 杀死了 它是在实时 USB 上运行的 Ubuntu 11 10 无需交换 PC 具有 1 Gig 的 RAM 唯一运行的应用程序 除了所有内置的 Ubuntu 东西 是我的程序 flasherav 请注
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码

随机推荐

  • Js的基础

    js的语法结构 1 js是区分大小写的 var username 张三 var userName 李四 document write username document write userName 2 js的标识符和命名规则 标识符 用来
  • 【hello Linux】线程概念

    目录 1 线程概念的铺设 2 Linux线程概念 2 1 什么是线程 2 2 线程的优点 2 3 线程的缺点 2 4 线程异常 2 5 线程用途 3 Linux进程VS线程 4 Linux线程控制 4 1 POSIX线程库 4 2 创建线程
  • react-router-dom文档

    前言 本来体验下react router的 然后 去react router npm查看 发现了官方的提示如下 这个包为 React Router 提供了核心路由功能 但你可能不想直接安装它 如果您正在编写将在浏览器中运行的应用程序 您应该
  • 四个步骤,教你打造自媒体爆款标题。

    做自媒体的心里应该都会明白一篇文章或者是一个视频中标题的重要性 当然取一个好的标题也是有点难度的 但是不必担心 也会有一定的取标题的技巧 下面小编就跟大家讲讲一些取标题的建议 1 内容拟定好标题 在创作标题的时候还是要以文章的具体内容进行创
  • Android之登录注册——简易版

    今天 我要分享给大家的是Android中常见的一个的登录注册的案例 我这里写的是简易版 如果大家有更精彩的拓展 可以自行发挥哦 运行过程相信大家都已经心知肚明了 所以我在这里就直接发布代码了 其中有不理解的地方大家可以自行百度 也可以互相学
  • Unity 按钮点击生成物体

    1 生成button 2 新建脚本ButtonListener using System Collections using System Collections Generic using UnityEngine using UnityE
  • java运行错误排查汇总

    Jetty排错信息1 Failed startup of context o e j w WebAppContext java lang IllegalStateException Duplicate fragment name 原因及解决
  • Linux -- 构建KVM虚拟化环境

    硬件系统的配置 硬件和BIOS中虚拟化技术的支持是KVM运行的先决条件 在x86 64架构的处理器中 KVM必需的硬件虚拟化扩展分别为 Intel的虚拟化技术 Intel VT 和AMD的AMD V技术 一般在BIOS中 VT的选项通过 A
  • Github + Hexo 搭建个人博客

    文章目录 Github Hexo 搭建个人博客 快速搭建 安装Node js 添加国内镜像源 安装 Git 注册 Github 安装Hexo 连接Github与本地 写文章 发布文章 图片添加水印 修改样式 文章基本操作 发表文章 修改文章
  • matlab 三法求矩阵权重(算数平均法求权重,几何平均法求权重,特征值法求权重)

    三法求矩阵权重 例子为3 3的矩阵 可根据需要修改 算数平均法求权重 clc clear judge 1 6 9 7 8 9 6 1 9 7 8 7 7 9 1 w zeros 3 3 for i 1 3 for j 1 3 w i j j
  • C 结构体字节对齐规则

    参考 https blog csdn net xiaoxiangyuhai article details 79192781
  • mysql数据库加密密码如何解密_MySQL加密和解密实例详解

    MySQL加密和解密实例详解 数据加密 解密在安全领域非常重要 对程序员而言 在数据库中以密文方式存储用户密码对入侵者剽窃用户隐私意义重大 有多种前端加密算法可用于数据加密 解密 下面我向您推荐一种简单的数据库级别的数据加密 解密解决方案
  • merge与update区别---->你一定要看!

    merge与update区别 注 就因为这2个方法的区别还得我花了太多时间项目迟迟不能做完 但是让我解决了 学到了东西了 这是一段代码 public void updateData Object obj try tx this getSes
  • Mysql的七种join

    对于SQL的Join 在学习起来可能是比较乱的 我们知道 SQL的Join语法有很多inner的 有outer的 有left的 有时候 对于Select出来的结果集是什么样子有点不是很清楚 Coding Horror上有一篇文章 实在不清楚
  • C++技能系列 ( 5 ) - 详解函数入参/返回参使用(值传递/引用传递/指针传递/智能指针传递)

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 期待动动小手 点击关注哦 当你休息的时候 一定要想到别人还在奔跑 When you rest we must thi
  • C++学习(六十九)国产先看GPU

    在CPU处理器领域 国产已经涉足了ARM MIPS甚至X86等多种指令集架构 不论自研还是授权都已经有所成就 但在GPU领域 国内厂商面对AMD NVIDIA两座大山恐怕连影都追不上 GPU市场的门槛太高 所以国内搞GPU自主研发的公司也有
  • Spring boot升级为Spring cloud配置修改(服务注册和服务发现简单案例)

    一 Spring Boot 升级Spring Cloud 1 导入Spring Cloud相关jar包 修改pom xml文件 备注 可能不同的Spring Boot版本会对应不同的Spring Cloud版本号 以下配置的Spring B
  • Android学习笔记——列表和适配器

    文章目录 一 ArrayAdapter适配器 二 下拉列表 Spinner 三 XML文件的引用 四 列表视图 listview 五 网格视图 GridView 六 自定义适配器 总结 一 ArrayAdapter适配器 适配器的角色就是将
  • 漏洞深入分析-2021

    前言 随着cve 2021 40444的披露 随机引爆了全球的网络安全 虽然最近微软发布了补丁 但是cve 2021 40444的利用却越发猖狂 0x00 0day样本分析 拿到样本的第一时间 便在自己的沙箱环境下面运行了下 并且从网上下载
  • 操作系统课设之Linux 进程间通信

    前言 课程设计开始了 实验很有意思 写博客总结学到的知识 白嫖容易 创作不易 学到东西才是真 本文原创 创作不易 转载请注明 本文链接 个人博客 https ronglin fun archives 175 PDF链接 见博客网站 CSDN