进程通信和信号量

news2024/12/23 18:15:19

1.进程通信

  1. 管道:包括无名管道(pipe)和命名管道(named
    pipe),无名管道可用于具有父进程和子进程之间的通信。命名管道除具有管道所具有的所有功能外,它还允许无亲缘关系进程间的通信。
  2. 消息队列:进程可以向队列中添加消息,其他进程可以读取队列中的消息
  3. 信号(signal)
  4. 共享内存:多个进程可以共同访问一块内存
  5. 信号量(semaphore):用于进程之间对共享资源进行加锁
  6. 套接字:可用于不同计算机之间的进程间通信

2.共享内存

多个进程共享一块内存,共享内存并未提供锁机制。如果需要对共享内存的读写加锁,可以使用信号。
在这里插入图片描述

2.2 查看共享内存的指令

ipcs -m 可以查看共享内存
在这里插入图片描述
ipcrm -m 共享内存编号 手工删除共享内存

#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mutex>
#include <sys/types.h>
#include <unistd.h>

// 共享内存大小
#define BUFFSIZE 1024
//写共享内存

int main(int argc, char *argv[]) {
    // 共享内存的标识
    int shmid;
    // 共享内存的key
    key_t key = 0x5005;
    char* shmaddr = nullptr;
    char* msg = nullptr;

    //创建共享内存
    if ((shmid = shmget(key, BUFFSIZE, IPC_CREAT | 0640)) < 0) {
        printf("shmget error!\n");
    }

    printf("Create shared-memory success, with shmid: %d\n", shmid);

    //将共享内存连接到当前进程的地址空间,由shmaddr指针指向它
    if ((shmaddr = (char*)shmat(shmid, NULL, 0)) < 0) {
        printf("shmat error!\n");
    }

    //拷贝数据到共享内存,需要用互斥锁      
    printf("写入前:%s\n", shmaddr);
    sprintf(shmaddr, "本程序 的进程号是:%d", getpid());
    printf("写入后:%s\n", shmaddr);

    //把共享内存从当前进程中分离
    shmdt(shmaddr);

    //删除共享内存
    if(shmctl(shmid, IPC_RMID, 0) == -1)
    {printf("shmctl(ox5005) failed\n"); return -1;}
  

    return 0;
}

3. 信号量

信号量是一种同步机制,用于协调并发访问共享资源的进程或线程之间的互斥和同步。信号量通常用于临界区控制、进程同步和进程间通信。

ipcs -s 查看信号量
ipcrm sem 信号量标识 删除信号量

#include "CSEM.h"

bool CSEM::init(key_t key)
 {
    if((sem_id = semget(key, 1, 0640)) == -1)//0640权限
    {
        //如果信号量不存在,创建它
        if(errno == 2)
        {
            if((sem_id = semget(key, 1, 0640 | IPC_CREAT)) == -1){printf("init 1 semget()"); return false;}

            //信号灯创建成功后,还需要把它初始化为可用状态
            union semun sem_union;
            sem_union.val = 1;
            if(semctl(sem_id, 0, SETVAL, sem_union) < 0){printf("init semctl"); return false;}
        }
        else {perror("init 2 segment()"); return false;}
    }
    return true;
 }

 bool CSEM::wait()
 {
    struct sembuf sem_b;
    sem_b.sem_num = 0;//信号量集的个数,单个信号量设置为0
    sem_b.sem_op = -1;//信号量在本次操作中需要改变的数据,-1等待操作,1发送操作
    sem_b.sem_flg = SEM_UNDO;//把此标志设置为SEM_UNDO,OS将跟踪这个信号量,
                //如果当前进程退出时没有释放信号量,操作系统释放信号量,避免资源被锁死
    if(semop(sem_id, &sem_b, 1) == -1){perror("wait semop()"); return false;}

    return true;
 }

bool CSEM::post()
{
    struct sembuf sem_b;
    sem_b.sem_num = 0;
    sem_b.sem_op = 1;
    sem_b.sem_flg = SEM_UNDO;
    if(semop(sem_id, &sem_b, 1) == -1){perror("post semop()"); return false;}

    return true;
}

bool CSEM::destory()
{
    if(semctl(sem_id, 0, IPC_RMID) == -1){perror("destroy semctl()");return false;}

    return true;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/sem.h>

class CSEM
{
private:
    union semun//用于信号灯操作的共同体
    {
        int val;
        struct semid_ds *buf;
        unsigned short *arry;
    };
    int sem_id;//信号灯描述

public:
    bool init(key_t key);   //如果信号灯已存在,获取信号灯;不存在,则创建信号灯并初始化
    bool wait();            //等待信号灯挂出
    bool post();            //挂出信号灯
    bool destory();         //销毁信号灯
};

#include "CSEM.h"

int main(int argc, char* argv[])
{
    CSEM sem;

    //初始化信号灯
    if(sem.init(0x5000) == false){printf("sem init failed!\n");return -1;}

    printf("init ok\n");

    //等待信号 成功后将持有锁
    if(sem.wait() == false) {printf("wait  failed!\n");return -1;}
    printf("sem ok!\n");

    sleep(20);

    //挂出信号灯,释放锁
    if(sem.post() == false) {printf("sem.post failed!\n");return -1;}
    printf("sem post ok!\n");
}

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

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

相关文章

代码量原地缩减50%,这个Java工具类库太香了

Guava是google公司开发的一款Java类库扩展工具包&#xff0c;内含了丰富的API&#xff0c;涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码&#xff0c;使代码更为优雅&#xff0c;另一方面它补充了很多jdk中没有的功能&#xff0c;能让我们开发中更…

长沙银行财报启示录:“生态引擎”如何突破“低维竞争”?

众多行业当中&#xff0c;银行业一直被当做“经济晴雨表”。 今年以来&#xff0c;中国经济开启回暖模式。尤其是在前不久的五一假期&#xff0c;各地消费回暖&#xff0c;释放出经济持续向好的积极信号。此时&#xff0c;也正是各家银行发布成绩单的财报季&#xff0c;能发现…

OPC UA Client接口库

OPC UA库秉承简单、易用、可靠的设计理念&#xff0c;只需少量接口即可实现所需功能&#xff0c;同时使用者无需考虑多线程&#xff0c;时序等问题 1. 拷贝代码文件 将 \JngOpcUaClient\JngOpcUaClient\Input\ 文件夹拷贝到项目中&#xff0c;添加到项目。 2. 拷贝dll库及Secu…

ES+Redis+MySQL,高可用架构设计方案

ES高可用方案 1. ES双中心主备集群架构 全平台所有体系的会员总量是十多亿。在这么大的数据体量下&#xff0c;业务线的查询维度也比较复杂。有的业务线基于手机号&#xff0c;有的基于微信unionid&#xff0c;也有的基于卡号等查询会员信息。这么大的数据量&#xff0c;又有…

Java基础(40)反射机制

Java反射机制是 Java 语言的一个重要特性。先了解两个概念&#xff0c;编译期和运行期。编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能&#xff0c;并没有把代码放在内存中运行…

平平无奇的Python为什么能一跃成为世界排名第一的语言

一、前言 本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么要学&#xff0c;希望能够给看到此文章的同学一点建议&#xff0c;树立学习目标&#xff0c;让学习有结果。 读完后&#xff0c;相信你一定能够有所收获。 二、简述个人经历…

Word控件Spire.Doc 【文本框】教程(4):如何将图像插入文本框

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

swift闭包底层本质

swift学习笔记 闭包底层原理 1、函数赋值给一个变量 func getFn(_ a: Int) -> Int {return a 1 }let funcVar getFn当在把一个函数赋值给一个变量funcVar的时候&#xff0c;funcVar变量会存储两个东西 funcVar总共占用16个字节前八个字节存储着getFn的函数地址后八个字…

浅聊一下NTP

浅聊一下NTP 仅了解&#xff0c;没实践过NTP 文章目录 浅聊一下NTP1.什么是NTP2.基本原理3.工作模式1.单播服务器/客户端模式2.对等体模式3.广播模式4.组播模式 4.NTP数据报文 1.什么是NTP 网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP协议族里面…

PowerShell系列(三):PowerShell发展历程梳理

目录 1、PowerShell 1.0 版本特性 2、PowerShell 2.0 版本特性 3、PowerShell 3.0 版本特性 4、PowerShell 4.0 版本特性 5、PowerShell 5.0 版本特性 6、PowerShell 5.1 版本特性 7、PowerShell6.0 Core 版本特性 8、PowerShell7.0 Core 版本特性 今天给大家聊…

openAI图像生成开发文档

图像生成 了解如何使用我们的 DALLE 型号 介绍 图像 API 提供了三种与图像交互的方法&#xff1a; 根据文本提示从头开始创建图像根据新的文本提示创建现有图像的编辑创建现有图像的变体 本指南介绍了使用这三个 API 终结点的基础知识以及有用的代码示例。要了解它们的实际…

海外网红营销vs国内网红营销:2023年市场洞察与策略差异

随着互联网和社交媒体的迅猛发展&#xff0c;网红营销已经成为一种炙手可热的推广方式。无论是国内还是海外&#xff0c;网红营销都在不断演变和创新&#xff0c;以满足广告主和品牌的需求。然而&#xff0c;海外网红营销和国内网红营销之间存在一些显著的区别。本文Nox聚星将和…

第三章 哈希表

目录 一、有效的字母异位词1.1 赎金信1.2 字符异位词分组1.3 找到字符串中所有字母异位词 二、两个数组的交集2.1 两个数组的交集 II 三、快乐数四、两数之和五、四数相加 II六、三数之和七、四数之和 哈希解决问题一般有三种数据结构供选择&#xff1a; 数组map&#xff08;映…

图解LeetCode——234. 回文链表

一、题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二、示例 2.1> 示例 1&#xff1a; 【输入】head [1,2,2,1] 【输出】true 2.2> 示例 2&#xff1a; 【输…

[Android Studio Tool]在Android Studio项目中如何使用CSV文件

文章目录 在Android Studio项目中如何使用CSV文件1. 前情提要&#xff1a;CSV文件的准备2. CSV文件在安卓项目一般存放在什么位置&#xff1f;3. Android Studio处理CSV文件的常用插件&#xff1f;4. 怎么调整Android Studio中对GBK编码的CSV文件的处理&#xff1f;以下是一个代…

就业内推 | 国企招运维工程师,红帽认证、华为认证优先

01 厦门中盾安信科技有限公司 &#x1f537;招聘岗位&#xff1a;应用运维工程师&#xff08;中级&#xff09; &#x1f537;职责描述&#xff1a; 1、负责平台应用系统的安装、配置、日常巡检、维护、故障的处理&#xff1b; 2、负责平台服务相关应用的部署、配置、日常巡检…

Java面试知识点(全)- Java IO知识点详细

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 从数据传输方式理解IO流 从数据传输方式或者说是运输方式角度看&#xff0c;可以将 IO 类分为: 字节流, 字节流读取单个字节&#xff0c;字符流读取单…

mock模拟数据 ,UmiJS构建项目

Mock是一个用于模拟数据的JavaScript库&#xff0c;可以根据需要生成各种数据类型的模拟数据&#xff0c;可以配合json server使用 并且可以使用拦截ajax请求来模拟后端API接口。 JSON Server则是一个使用JSON文件来模拟RESTful API的工具 > 默认安装到运行环境&#xff1…

MYSQL索引、事务、存储引擎

一、索引 索引是一个排序的列表&#xff0c;包含字段的值和相应的行数据的物理地址 作用&#xff1a;加快表的查询速度&#xff0c;可以对字段排序 如何实现&#xff1a;没有索引的情况&#xff0c;要查询某行数据&#xff0c;需要先扫描全表来定位某行数据。有索引后会通过…

java ThreadLocal

private ThreadLocal threadLocal new ThreadLocal(); threadLocal.set(0); (int) threadLocal.get(); 上面三行代码分别是定义、赋值和取值。 介绍&#xff1a; 我们只需要实例化对象一次&#xff0c;并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个T…