2024.2.26

news2024/12/25 14:05:11

1、实现信号灯集

sem.c
#include<myhead.h>

union semun {
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                (Linux-specific) */
};



//定义给信号灯集中的指定信号灯进行赋值
int init_semno(int semid, int semno)
{
    union semun buf;
    printf("请输入要给编号为%d的灯设置的值:", semno);
    scanf("%d", &buf.val);
	getchar();

    //调用控制函数
    if(semctl(semid, semno, SETVAL, buf) == -1)
    {
        perror("semctl error");
        return -1;
    }

    return 0;
}


//创建或打开共享内存:参数为要申请的信号灯集中包含的灯的个数,返回值信号灯集的id
int open_sem(int semcount)
{
    //创建key值
    key_t key = -1;
    if((key = ftok("/", 's')) == -1)
    {
        perror("ftok error");
        return -1;
    }

    //通过key值创建一个信号灯集
    int semid = -1;
    if((semid = semget(key, semcount, IPC_CREAT|IPC_EXCL|0664)) == -1)
    {
        //对错误码进行判断,如果错误码为EEXIST,说明信号灯集已经存在
        if(errno == EEXIST)
        {
            //直接打开信号灯集即可
            semid = semget(key, semcount, IPC_CREAT|0664);
            return semid;
        }

        perror("semget error");
        return -1;

    }

    //给信号灯集中的每个灯进行初始化操作
    for(int i=0; i<semcount; i++)
    {
        init_semno(semid, i);           //对编号为i的灯进行初始化
    }

    return semid;

}


//进行申请资源操作:参数为要申请的信号灯id,以及灯的编号
int P(int semid, int semno)
{
    //定义要进行操作的结构体变量
    struct sembuf buf;
    buf.sem_num = semno;
    buf.sem_op = -1;           //表示申请资源
    buf.sem_flg = 0;          //表示阻塞方式申请

    //执行函数
    if(semop(semid, &buf, 1) ==-1)
    {
        perror("P error");
        return -1;
    }

    return 0;
}


//进行释放资源操作:参数为要申请的信号灯id,以及灯的编号
int V(int semid, int semno)
{
    //定义要进行操作的结构体变量
    struct sembuf buf;
    buf.sem_num = semno;
    buf.sem_op = 1;           //表示释放资源
    buf.sem_flg = 0;          //表示阻塞方式释放

    //执行函数
    if(semop(semid, &buf, 1) ==-1)
    {
        perror("V error");
        return -1;
    }

    return 0;
}


//删除信号灯集的操作:参数为要删除的信号灯集id
int del_sem(int semid)
{
    //删除信号灯集
    if(semctl(semid, 0, IPC_RMID) == -1)
    {
        perror("delete error");
        return -1;
    }

    return 0;
}

shmsnd.c
#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096     //一页的大小

int main(int argc, const char *argv[])
{

    //11、创建信号灯集
    int semid = open_sem(2);

    //1、创建key值
    key_t key = -1;
    if((key = ftok("/", 'k')) == -1)
    {
        perror("ftok error");
        return -1;
    }
    printf("key = %d\n", key);

    //2、通过key值创建一个共享内存
    int shmid = -1;
    if((shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664)) == -1)
    {
        perror("shmget error");
        return -1;
    }
    printf("shmid = %d\n", shmid);

    //3、将共享内存段的数据映射到用户空间
    char *addr = shmat(shmid, NULL, 0);
    //参数2:让系统自动选择对齐页
    //参数3:对共享内存的操作为读写操作
    if(addr == (void*)-1)
    {
        perror("shmat error");
        return -1;
    }
    printf("addr = %p\n", addr);

    //4、使用共享内存
    while(1)
    {

        //22、申请0号灯的资源
        P(semid, 0);

        printf("请输入>>>");
        fgets(addr, PAGE_SIZE, stdin);
        addr[strlen(addr)-1] = 0;

        printf("数据发送成功\n");

        //33、释放1号灯的资源
        V(semid, 1);

        //判断输入内容
        if(strcmp(addr, "quit") == 0)
        {
            break;
        }

        if(strcmp(addr, "q") == 0)
        {
            break;
        }

    }

    //5、取消映射关系
    if(shmdt(addr) == -1)
    {
        perror("shmdt error");
        return -1;
    }

    //6、删除共享内存
    if(shmctl(shmid, IPC_RMID, NULL) == -1)
    {
        perror("shmctl error");
        return -1;
    }



    return 0;
}

shmrcv.c
#include<myhead.h>
#include"sem.h"

#define PAGE_SIZE 4096     //一页的大小

int main(int argc, const char *argv[])
{
    //11、创建信号灯集
    int semid = open_sem(2);

    //1、创建key值
    key_t key = -1;
    if((key = ftok("/", 'k')) == -1)
    {
        perror("ftok error");
        return -1;
    }
    printf("key = %d\n", key);

    //2、通过key值创建一个共享内存
    int shmid = -1;
    if((shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664)) == -1)
    {
        perror("shmget error");
        return -1;
    }
    printf("shmid = %d\n", shmid);

    //3、将共享内存段的数据映射到用户空间
    char *addr = shmat(shmid, NULL, 0);
    //参数2:让系统自动选择对齐页
    //参数3:对共享内存的操作为读写操作
    if(addr == (void*)-1)
    {
        perror("shmat error");
        return -1;
    }
    printf("addr = %p\n", addr);          //?

    //4、使用共享内存
    while(1)
    {
        //22、申请1号灯的资源
        P(semid, 1);

        printf("收到的数据为:%s\n", addr);


        //判断输入内容
        if(strcmp(addr, "quit") == 0)
        {
            break;
        }

        //33、释放0号灯的资源
        V(semid, 0);


    }

    //5、取消映射关系
    if(shmdt(addr) == -1)
    {
        perror("shmdt error");
        return -1;
    }

    //44、删除信号灯集
    del_sem(semid);





    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

备考2025年考研数学(一)真题练习和解析——填空题

今天距离2025年考研预计还有10个月的时间&#xff0c;看起来挺长&#xff0c;但是对于备考2025年考研的同学来说&#xff0c;必须用好每一天。为了帮助大家提升考研数学一的成绩&#xff0c;我收集整理了1987-2024年的考研数学一的真题和解析&#xff0c;并把2015-2024年十年的…

一个39岁程序员的自白,大龄程序员的出路在哪里?

一个39岁程序员的自白&#xff0c;大龄程序员的出路在哪里&#xff1f; 大龄程序员&#xff0c;最悲惨的&#xff0c;可能是但凡你发个贴&#xff0c;下面就会有类似这种人来怼你 本文来自知乎一个大龄程序员老哥&#xff08;白圣君&#xff09;的自白&#xff0c;涤生哥已经经…

现在骨传导耳机什么牌子最好?专业选购指南与避坑策略

近些年来&#xff0c;耳机行业飞速发展&#xff0c;耳机已经成为日常生活中不可或缺的伙伴&#xff0c;无论是休闲时刻还是运动健身&#xff0c;耳机都伴随着我们。然而长时间使用传统的入耳式耳机可能会导致听力受损、容易脱落和不卫生等问题。为了解决这些问题&#xff0c;满…

【GameFramework框架内置模块】3、数据表(Data Table)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

3 easy 26. 删除有序数组中的重复项

双指针&#xff1a; //给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 //一致 。然后返回 nums 中唯一元素的个数。 // // 考虑 nums 的唯…

服务器防漏扫

什么是漏扫&#xff1f; 漏扫是漏洞扫描的简称。漏洞扫描是一种安全测试方法&#xff0c;用于发现计算机系统、网络或应用程序中的潜在漏洞和安全弱点。通过使用自动化工具或软件&#xff0c;漏洞扫描可以检测系统中存在的已知漏洞&#xff0c;并提供相关的报告和建议&#xf…

如何在Linux部署Portainer并结合内网穿透远程管理本地Docker容器

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis

前言&#xff1a; 当今互联网技术日新月异&#xff0c;随着数据量的爆炸式增长&#xff0c;如何高效地存储和管理数据成为了每个公司都必须面对的挑战。与此同时&#xff0c;用户对于应用程序的响应速度和稳定性要求也越来越高。在这个背景下&#xff0c;Redis 作为一个…

C++ 学习之函数对象

C 函数对象基本概念 在C中&#xff0c;函数对象&#xff08;Function Objects&#xff09;是一种类或结构体&#xff0c;它重载了函数调用运算符operator()&#xff0c;因此可以像函数一样被调用。函数对象有时也被称为仿函数&#xff08;Functor&#xff09;。 以下是关于C函…

备战蓝桥杯---基础算法刷题2

题目有一点水&#xff0c;不过还是有几个好题的&#xff0c;我在这分享一下&#xff1a; 很容易想到先往最高处跳再往最低处跳&#xff0c;依次类推&#xff0c;那怎么保证其正确性呢&#xff1f; 证法1. 在此&#xff0c;我们从0开始&#xff0c;假设可以跳到a,b,c(a<b<…

Linux中消息队列

消息队列 概念 消息队列是System V IPC对象的一种消息队列有消息队列ID来唯一标识消息队列就是一个消息列表。用户可以在消息队列中添加消息、读取信息等消息队列可以按照类型来发送/结束消息 消息队列使用步骤 打开/创建消息队列 msgget向消息队列发送信息 msgsnd从消息队…

4.4 MySQL存储

目录 1、使用前提 2、使用连接数据库最初步骤 2.1 最初步骤 2.2 connect()方法中参数简单传递 3、创建数据库(创建架构)和创建表 3.1 创建数据库(创建架构) 3.2 创建表 3.2.1 基本创建 3.2.2 创建自增主键 4、Pycharm 可视化连接 MySQL 图形界面 5、插入、更新、查询…

项目管理工具git

git 1. git介绍1.1. 版本控制系统 2. 创建本地版本库2.1 概念2.2 操作步骤 3. 修改文件4. 练习: 添加一个本地项目到仓库5. 添加远程仓库5.1 添加远程仓库5.2 本地仓库同步到远程仓库5.3 克隆远程仓库到本地5.4 SSH设置 6. 分支管理6.1 创建分支6.2 切换分支6.3 合并分支6.4 解…

基于yolov5的苹果检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的苹果检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的苹果检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目&#xf…

Go语言必知必会100问题-06 生产者端接口

生产者端接口 Go语言必知必会100问题-05 接口污染中介绍了程序中使用接口是有价值的。在编码的时候&#xff0c;接口应该放在哪里呢&#xff1f;这是Go开发人员经常有误解的一个问题&#xff0c;本文将深入分析该问题。 在深入探讨问题之前&#xff0c;先对提及的术语做一个定…

如何使用Inno Setup制作Unity构建程序的Windows安装程序

1. 准备 &#xff08;1&#xff09;准备好Unity构建的程序集合 必须包括&#xff1a; Data文件夹&#xff08;xxx_Data&#xff09; Mono文件夹&#xff08;MonoBleedingEdge&#xff09; 打包的应用程序文件&#xff08;xxx.exe&#xff09; Unity播放器dll文件&#xff…

mac flutter 配置

下载Flutter Sdk 直接访问官网无法下载&#xff0c;需要访问中国镜像下载 Flutter SDK 归档列表 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter Start building Flutter Android apps on macOS - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 下载后解压…

HCIA-Datacom实验指导手册:5.1 实验一:FTP SFTP TFTP 基础配置实验

HCIA-Datacom实验指导手册&#xff1a;5.1 实验一&#xff1a;FTP 基础配置实验 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 设备基础配置步骤 2 在 Router 上配置 FTP 和SFTP服务器功能及参数步骤 3 配置本地 …

大厂经验谈之OKR目标管理

前言 这是大厂经验谈系列第一篇文章,来看看互联网公司是如何制定和管理目标的。OKR是目前互联网公司经常采用的目标管理工具,最开始也是由国外著名公司推崇,比如Google、微软、亚马逊等,后面才逐步引入国内。既然是工具就有用得好和不好的地方,很多团队仍然把OKR当做KPI来…

【人工智能高频面试题--基本篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;人工智能高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 人工智能高频面试题--基本篇 1.深度学习和过往的神经网络训练方法有什么区别&#xff1f;列举…