Linux —— 进程间通信(System V)

目录

一,共享内存

申请共享内存 shmget

控制共享内存 shmctl

关联共享内存 shmat / 去联共享内存 shmdt

二,消息队列

创建或打开消息队列 msgget

发送消息 msgsnd / 接收消息 msgrcv

控制消息 msgctl

三,信号量

创建或打开信号量 semget

信号量操作 semop

信号量控制 semctl


一,共享内存

        共享内存是最快的进程间通信IPC形式,即允许两个或多个进程共享物理内存的同一块区域(通常被称为段),进程间数据传递将不再涉及到内核(即将不再通过内核系统调用来传递数据);

维护共享内存的数据结构

//vim /usr/include/bits/shm.h
struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kernel_time_t shm_ctime; /* last change time */__kernel_ipc_pid_t shm_cpid; /* pid of creator */__kernel_ipc_pid_t shm_lpid; /* pid of last operator */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_unused; /* compatibility */void *shm_unused2; /* ditto - used by DIPC */void *shm_unused3; /* unused */
};
//vim /usr/include/bits/ipc.h/* Data structure used to pass permission information to IPC operations.  */    struct ipc_perm    {    __key_t __key;      /* Key.  */    __uid_t uid;      /* Owner's user ID.  */    __gid_t gid;      /* Owner's group ID.  */    __uid_t cuid;     /* Creator's user ID.  */    __gid_t cgid;     /* Creator's group ID.  */    unsigned short int mode;    /* Read/write permission.  */    unsigned short int __pad1;    unsigned short int __seq;   /* Sequence number.  */    unsigned short int __pad2;    __syscall_ulong_t __unused1;    __syscall_ulong_t __unused2;    }; 

申请共享内存 shmget

  • key,用于唯一区分共享内存,可由ftok函数生成;
  • size,建议为4KB的倍数;
  • shmflg,标签;
    • IPC_CREAT,如目标共享内存不存在,即创建,否则获取;
    • IPC_CREAT | IPC_EXCL,如目标共享内存不存在,即创建,否则出错;

//vim /usr/include/bits/ipc.h#include <bits/types.h>    /* Mode bits for `msgget', `semget', and `shmget'.  */    #define IPC_CREAT 01000   /* Create key if key does not exist. */    #define IPC_EXCL  02000   /* Fail if key exists.  */    #define IPC_NOWAIT  04000   /* Return error on wait.  */    /* Control commands for `msgctl', `semctl', and `shmctl'.  */    #define IPC_RMID  0   /* Remove identifier.  */    #define IPC_SET   1   /* Set `ipc_perm' options.  */    #define IPC_STAT  2   /* Get `ipc_perm' options.  */    #ifdef __USE_GNU    # define IPC_INFO 3   /* See ipcs.  */    #endif 

控制共享内存 shmctl

关联共享内存 shmat / 去联共享内存 shmdt

//makefile
CC=gcc    
.PHONY:all    
all: server client    server:server.c    $(CC) -o $@ $^        
client:client.c    $(CC) -o $@ $^        .PHONY:clean        
clean:    rm -rf server client  
//comm.h
#pragma once    
#include <stdio.h>    #define PATH_NAME "/home/wz/Desktop/pipe"    
#define PROJ_ID 0x6666#define SIZE 4097
//server.c
include "comm.h"    
#include <stdio.h>    
#include <unistd.h>    
#include <string.h>    
#include <sys/types.h>    
#include <sys/ipc.h>    
#include <sys/shm.h>    int main()    
{    key_t k = ftok(PATH_NAME, PROJ_ID);    if(k < 0){    perror("ftok");    return 1;    }    printf("key: %x\n", k);    sleep(3);    int shmid = shmget(k, SIZE, IPC_CREAT|IPC_EXCL|0644);    if(shmid < 0){    perror("shmget");    return 2;    }    printf("shmid: %d\n", shmid);    sleep(3);    char* start = (char*)shmat(shmid, NULL, 0);    printf("server already attach on shared memory!\n");    while(1){    printf("%s\n", start);    sleep(1);                                                                                                  if(strlen(start) == 26)    break;    }    shmdt(start);    printf("server already dattach off shared memory!\n");    sleep(3);    shmctl(shmid, IPC_RMID, NULL);    printf("delete %d\n", shmid);    return 0;    
}  
//client.c
#include "comm.h"    
#include <stdio.h>    
#include <unistd.h>    
#include <string.h>    
#include <sys/types.h>    
#include <sys/ipc.h>    
#include <sys/shm.h>    int main()    
{    key_t k = ftok(PATH_NAME, PROJ_ID);    if(k < 0){    perror("ftok");    return 1;    }    printf("key: %x\n", k);    sleep(3);    int shmid = shmget(k, SIZE, IPC_CREAT);    if(shmid < 0){    perror("shmget");    return 2;    }    printf("client shmid: %d\n", shmid);    sleep(3);    char* start = (char*)shmat(shmid, NULL, 0);    printf("client already attach on shared memory!\n");    char c = 'A';    while(c <= 'Z'){    start[c - 'A'] = c;    c++;    sleep(1);                                                                                                  }    shmdt(start);    printf("client already dattach off shared memory!\n");    sleep(3);    return 0;    
}    
//查看共享内存
[wz@192 pipe]$ ipcs -m
//删除指定id共享内存
[wz@192 pipe]$ ipcrm -m 426047

共享内存的生命周期随OS;

共享内存不提供任何同步与互斥,彼此独立;

共享内存是所有进程间通信中,速度最快的;

共享内存系统分配的shm,是按照4KB为基本单位的,如指定不是4KB的倍数,多余会浪费掉;

二,消息队列

        消息队列是进程间通信的一种方式,提供一个从一个进程向另一个进程发生一块数据的方法;

维护消息队列的数据结构

//vim /usr/include/bits/msq.h 
/* Structure of record for one message inside the kernel.    The type `struct msg' is opaque.  */    struct msqid_ds    {    
E>  struct ipc_perm msg_perm; /* structure describing operation permission */    __time_t msg_stime;   /* time of last msgsnd command */    #ifndef __x86_64__    unsigned long int __unused1;    #endif    __time_t msg_rtime;   /* time of last msgrcv command */    #ifndef __x86_64__    unsigned long int __unused2;    #endif    __time_t msg_ctime;   /* time of last change */                                                            #ifndef __x86_64__    unsigned long int __unused3;    #endif    __syscall_ulong_t __msg_cbytes; /* current number of bytes on queue */    msgqnum_t msg_qnum;   /* number of messages currently on queue */    msglen_t msg_qbytes;    /* max number of bytes allowed on queue */    __pid_t msg_lspid;    /* pid of last msgsnd() */    __pid_t msg_lrpid;    /* pid of last msgrcv() */    __syscall_ulong_t __unused4;    __syscall_ulong_t __unused5;    }; 

创建或打开消息队列 msgget

  • key,用于唯一区分共享内存,可由ftok函数生成;
  • msgflg,标签;
    • IPC_CREAT,如目标消息队列不存在,即创建,否则获取;
    • IPC_CREAT | IPC_EXCL,如目标消息队列不存在,即创建,否则出错;

发送消息 msgsnd / 接收消息 msgrcv

控制消息 msgctl

三,信号量

        信号量并不是原来进程间传输数据的,是原来同步进程当作的,主要用于同步与互斥;由于进程要求共享资源,而有些资源需互斥使用;系统中的某些资源一次只允许一个进程使用,称这些资源为临界资源或互斥资源;涉及到互斥资源的程序段,称为临界区;

维护信号量的数据结构

//vim /usr/include/bits/sem.h /* Data structure describing a set of semaphores.  */    struct semid_ds    {    struct ipc_perm sem_perm;   /* operation permission struct */    __time_t sem_otime;     /* last semop() time */    __syscall_ulong_t __unused1;    __time_t sem_ctime;     /* last time changed by semctl() */    __syscall_ulong_t __unused2;    __syscall_ulong_t sem_nsems;    /* number of semaphores in set */    __syscall_ulong_t __unused3;    __syscall_ulong_t __unused4;    };    

创建或打开信号量 semget

信号量操作 semop

信号量控制 semctl

 

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

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

相关文章

搭建Everything+cpolar在线资料库,实现随时随地访问

Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…

【算法系列篇】双指针

文章目录 前言什么是双指针算法1.移动零1.1 题目要求1.2 做题思路1.3 Java代码实现 2.复写零2.1 题目要求2.2 做题思路2.3 Java代码实现 3.快乐数3.1 题目要求3.2 做题思路3.3 Java代码实现 4.盛最多水的容器4.1 题目要求4.2 做题思路4.3 Java代码实现 5.有效三角形的个数5.1 题…

HAProxy搭建web集群

HAProxy Haproxy概念 HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理&#xff0c;是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大&#xff08;并发达1w以上&#xff09;web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy的运…

023:vue中解决el-date-picker更改样式不生效问题

第023个 查看专栏目录: VUE ------ element UI 本文章目录 修改后的效果示例源代码&#xff08;共52行&#xff09;核心内容步骤&#xff1a;&#xff08;1&#xff09;更改样式&#xff08;2&#xff09;添加参数 专栏目标 在vue项目开发中&#xff0c;我们打算保持颜色的一致…

第三讲:ApplicationContext的实现

这里写目录标题 一、前文回顾二、基础代码准备三、基于XML的ClassPathXmlApplicationContext1. 创建spring-config.xml配置文件2. 指定配置文件的路径 四、基于注解的AnnotationConfigApplicationContext1. 新增一个配置类2.指定配置类信息 五、基于注解和ServletWebServer应用…

Azure虚拟网络对等互连

什么是Azure虚拟网络对等互联 Azure虚拟网络对等互联&#xff08;Azure Virtual Network peering&#xff09;是一种连接两个虚拟网络的方法&#xff0c;使得这两个虚拟网络能够在同一地理区域内进行通信。它通过私有IP地址在虚拟网络之间建立网络连接&#xff0c;不论是在同一…

Linux命令200例:head用于显示文件的开头部分(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

LVS 负载均衡集群

集群 集群&#xff08;Cluster&#xff09;是一组相互连接的计算机或服务器&#xff0c;它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作&#xff0c;提高计算能力、可用性、性能和可伸缩性&#xff0c;适用于大量高并发的场景。 集群…

消息中间件的选择:RabbitMQ是一个明智的选择

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; MQ&#xff08;Message Queue&#xff09; MQ&#xff08;消息队列&#xff09;是一种用于在应用程序之间进行异步通信的技术&#xff1b;允许应用程序通过发送和接收…

【物联网无线通信技术】NFC从理论到实践(FM17XX)

NFC&#xff0c;全称是Near Field Communication&#xff0c;即“近场通信”&#xff0c;也叫“近距离无线通信”。NFC诞生于2004年&#xff0c;是基于RFID非接触式射频识别技术演变而来&#xff0c;由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.5…

【记录】Python3|selenium4 极速上手入门(Windows)

环境&#xff1a;Windows 版本&#xff1a;python3&#xff0c;selenium 4.11.2 文章目录 1 装ChromeEdge其他浏览器 2 运行报错RequestsDependencyWarning: urllib3 (1.26.9) or chardet (3.0.4) doesn‘t match a supported version打开了浏览器&#xff0c;但是没有显示网页…

linux 安装 kibana

首先下载 kibana https://www.elastic.co/cn/downloads/kibana 然后上传到linux /usr/local 目录下解压安装 修改config/kibana.yml 配置文件&#xff0c;将elasticsearch.hosts 然后再nginx 中做一个端口映射&#xff0c;实现在浏览器中输入后xxxx:5602 nginx 可以将请求转发…

SPSS--如何使用分层分析以及分层分析案例分享

分层分析&#xff1a;将资料按某个或某些需要控制的变量的不同分类进行分层&#xff0c;然后再估计暴露因子与某结局变量之间关系的一种资料分析方法。 分层分析的最重要的用途是评估和控制混杂因子所致的混杂偏倚。通过按混杂因子分层&#xff0c;可使每层内的两个比较组在所控…

从零做软件开发项目系列之二——需求调研

在接到软件开发任务之后&#xff0c;第一件要做的事情就是进行需求调研工作&#xff0c;基于前期的沟通以及合同向用户了解具体需求&#xff0c;从而有针对性地开展后续工作。整个调研过程分为调研准备&#xff0c;调研实施&#xff0c;需求分析。 1 调研准备 俗话说&#x…

go语言恶意代码检测系统--对接前端可视化与算法检测部分

Malware Detect System 1 产品介绍 恶意代码检测系统。 2 产品描述 2.1 产品功能 功能点详细描述注册账号未注册用户注册成为产品用户&#xff0c;从而具备享有产品各项服务的资格登录账号用户登录产品&#xff0c;获得产品提供的各项服务上传恶意样本用户可以将上传自己的…

leetcode 279. 完全平方数

2023.8.18 与零钱兑换相似&#xff0c;本题属于完全背包问题&#xff1a;完全平方数为物品&#xff0c;整数n为背包。 直接上代码&#xff1a; class Solution { public:int numSquares(int n) {vector<int> dp(n1 , INT_MAX);dp[0] 0;for(int i1; i*i<n; i){for(in…

九耶丨阁瑞钛伦特-Spring boot与Spring cloud 之间的关系

Spring Boot和Spring Cloud是两个相互关联的项目&#xff0c;它们可以一起使用来构建微服务架构。 Spring Boot是一个用于简化Spring应用程序开发的框架&#xff0c;它提供了自动配置、快速开发的特性&#xff0c;使得开发人员可以更加轻松地创建独立的、生产级别的Spring应用程…

高效实用小工具之Everything

一&#xff0c;简介 有时候我们电脑文件较多时&#xff0c;想快速找到某个文件不是一件容易的事情&#xff0c;实用windows自带的搜素太耗时&#xff0c;效率不高。今天推荐一个用来搜索电脑文件的小工具——Everything&#xff0c;本文将介绍如何安装以及使用everything&…

FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解

文章目录 1 定义1.1 锁存器&#xff08;latch&#xff09;1.2 触发器&#xff08;flip-flop&#xff09;1.3 寄存器&#xff08;register&#xff09; 2 比较2.1 锁存器&#xff08;Latch&#xff09;危害即产生原因2.2 寄存器和锁存器的区别2.3 锁存器和触发器的区别 3 结构3.…

如何将常用的jdbc方法封装起来???

你是否还在为每次新建项目连接数据库而烦恼&#xff1f;&#xff1f;&#xff1f;&#xff08;教你一次代码&#xff0c;简单完成每次连接&#xff09; 1.建立maven项目 还没下载安装或者不会建立maven项目的可以看这里哦&#xff1a;maven的下载安装与配置环境变量&#xff0…