共享内存和信号灯集练习

#include <mystdio.h>

int main(int argc, const char *argv[])
{
    //创建key值
    key_t key = ftok("/home/ubuntu",2);
    if(key<0)
    {
        perror("ftok");
        return -1;
    }
    printf("key=%#x\n",key);
    //创建信号灯集
    int semid = semget(key,2,IPC_CREAT|0664);
    if(semid < 0)
    {
        perror("semget");
        return -1;
    }
    //设置信号灯值
    unsigned short brr[2] = {0,1};
    if(semctl(semid,0,SETALL,brr)<0)
    {
        perror("semctl");
        return -1;
    }
    //通过key值寻找共享内存
    int shmid = shmget(key,128,IPC_CREAT|0664);
    if(shmid<0)
    {
        perror("shmget");
        return -1;
    }
    printf("shmid=%#x\n",shmid);
    //将共享内存映射到用户空间
    void* adr = shmat(shmid,NULL,0);
    if((void*)-1 == adr)
    {
        perror("shmat");
        return -1;
    }
    printf("adr = %p\n",adr);

    char* ptr = (char*)adr;
    strcpy(ptr,"1234567");

    struct sembuf sop;
    while(1)
    {
        sop.sem_num = 1;
        sop.sem_op = -1;
        sop.sem_flg = 0;

        if(semop(semid,&sop,1) < 0)
        {
            perror("semop");
            return -1;
        }
        printf("%s\n",ptr);

        sop.sem_num = 0;
        sop.sem_op = +1;
        sop.sem_flg = 0;

        if(semop(semid,&sop,1) <0)
        {
            perror("semop");
            return -1;
        }
    }
    
    return 0;
}

#include <mystdio.h>


int main(int argc, const char *argv[])
{
    //找到key值
    key_t key = ftok("/home/ubuntu",2);
    if(key <0)
    {
        perror("ftok");
        return -1;
    }
    printf("key=%#x\n",key);
    //创建信号灯集
    int semid = semget(key,2,IPC_CREAT|0664);
    if(semid < 0)
    {
        perror("semget");
        return -1;
    }

    //通过key值寻找共享内存
    int shmid = shmget(key,128,IPC_CREAT|0664);
    if(shmid<0)
    {
        perror("shmget");
        return -1;
    }
    printf("shmid=%#x\n",shmid);
    //将共享内存映射到用户空间
    void* adr = shmat(shmid,NULL,0);
    if((void*)-1 == adr)
    {
        perror("shmat");
        return -1;
    }
    printf("adr = %p\n",adr);

    char* ptr = (char*)adr;
    char* start = NULL;
    char* end = NULL;

    char temp=0;
    struct sembuf sop;

    while(1)
    {
        sop.sem_num = 0;
        sop.sem_op = -1;
        sop.sem_flg = 0;

        if(semop(semid,&sop,1)<0)
        {
            perror("semop");
            return -1;
        }

        start = ptr;
        end = start + strlen(ptr)-1;

        while(start < end)
        {
            temp = *start;
            *start = *end;
            *end = temp;
            start++;
            end--;
        }

        sop.sem_num = 1;
        sop.sem_op = +1;
        sop.sem_flg = 0;
        if(semop(semid,&sop,1) < 0)
        {
            perror("semop");
            return -1;
        }
    }
    
    
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是0-day漏洞,怎么防护0-day漏洞攻击

随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中0day漏洞攻击作为一种高级威胁手段&#xff0c;给企业和个人用户带来了极大的风险。下面德迅云安全就对0day漏洞攻击进行简单讲解下&#xff0c;并分享相应的一些安全措施&#xff0c;以期提高网络安全…

开源项目-汽车租赁管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-汽车租赁管理系统 汽车租赁管理系统的主要功能包括汽车管理,新闻管理,用户管理,订单管理,数据展示等模块 注:后续文章都会附上安装教程,有问题也欢迎大家评论私信。 登录 汽车管理 汽车管理可以查看所有汽车进行线上汽…

每日一题:痛苦数

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…

CRAFT文字检测算法解析和基于C++和TensorRT的推理实现

本文讲解了CVPR 2019的一篇文字检测算法《Character Region Awareness for Text Detection》的原理&#xff0c;并给出我使用C和TensorRT重新实现的推理&#xff0c;速度比原版代码快12倍。 论文&#xff1a;https://arxiv.org/pdf/1904.01941.pdf 官方代码&#xff1a;https:…

simple-jwt快速入门(包含自定制)

simple-jwt快速入门(包含自定制) 目录 simple-jwt快速入门(包含自定制)安装路由层视图层全局配置前端传入参数配置文件定制登录返回格式定制payload格式自定制签发-认证 安装 pip install djangorestframework-simplejwt路由层 from rest_framework_simplejwt.views import T…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中&#xff0c;免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中&#xff0c;免费货物的标准解决方案概览&#xff0c;可先了解本博客博文&#xff1a;SAP销售与分销中的免费货物解决方案相关文章&#xff1a; htt…

SQLite R*Tree 模块(三十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS3 和 FTS4 扩展(三十二) 下一篇:SQLite轻量级会话扩展&#xff08;三十四&#xff09; 1. 概述 R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统&#xff0c;其中…

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数&#xff1a; N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

数字谐振器设计

数字谐振器设计 电路里的谐振:当电路中激励的频率等于电路的固有频率时&#xff0c;电路电磁振荡的振幅也将达到峰值。 形式一 形式二 例子

Python程序设计 字典

教学案例十 字典 1. 判断出生地 sfz.txt文件中存储了地区编码和地区名称 身份证的前6位为地区编码&#xff0c;可以在sfz.txt文件中查询到地区编号对应的地区名称 编写程序&#xff0c;输入身份证号&#xff0c;查询并显示对应的地区名称 若该地区编码不在文件中&#xff0c;…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的&#xff0c;而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题&#xff0c;但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy&#xff0c;BLEU 的分数取值范围是 0&#xff5e;1&#xff0c;分数越接近1&a…