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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【esp32】GPIO引脚功能使用集合

本文主要介绍 esp32 这块芯片的GPIO 口功能使用以及软硬件设计注意事项 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页…

Mac操作系统Safari 17全新升级:秋季推出全部特性

苹果的内置浏览器可能是Mac上最常用的应用程序&#xff08;是的&#xff0c;甚至比Finder、超级Mac Geeks还要多&#xff09;。因此&#xff0c;苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中&#xff0c;Safari可以帮助你提高工作效…

【HCIP】15.MPLS基础

多协议标签交换 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部实现数据快速转发。 术语 MPLS域&#xff08;MPLS Domain&#xff09;&#xff1a;一系列…

C语言学习笔记(完整版)

文章目录 算法算法的基本概念算法的特征算法的优劣 描述算法三种基本结构流程图N-S流程图伪代码 常量和变量了解数据类型常量整形常量实型常量字符型常量转义字符符号常量 变量整形变量实型变量字符型变量 表达式与运算符赋值运算符和赋值表达式变量赋初值强制类型转换 算术运算…

行式存储与列式存储

1.概述 数据处理大致可分为两大类&#xff0c;联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用&#xff0c;用来执行一些基本的、日常的事务处理&#xff0c;比如数据库记录的增、删…

LAMP配置与应用

web资源类型&#xff1a; 静态资源&#xff1a;原始形式与响应内容一致&#xff0c;在客户端浏览器执行 动态资源&#xff1a;原始形式通常为程序文件&#xff0c;需要在服务器端执行之后&#xff0c;将执行结果返回给客户端 LAMP架构组成&#xff1a; L&#xff1a;linux …

翻倍以链表形式表示的数字

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 有点相似于&#xff1a;链表相加II&#xff0c;这道题我们仍然有进位&#xff0c;但不同的是&#xff0c;链表相加我们选择了开辟新节点&#xff0c;这道题我们选择反转两次链表&#xff0c;开始一次&#xff0c;结束一次…

测试工具coverage的高阶使用

在文章Python之单元测试使用的一点心得中&#xff0c;笔者介绍了自己在使用Python测试工具coverge的一点心得&#xff0c;包括&#xff1a; 使用coverage模块计算代码测试覆盖率使用coverage api计算代码测试覆盖率coverage配置文件的使用coverage badge的生成 本文在此基础上…

CrystalNet .Net VCL for Delphi Crack

CrystalNet .Net VCL for Delphi Crack VCL或更为人所知的可视化组件库是基于一个面向对象的框架&#xff0c;什么是用户对开发人员和事件的Microsoft Windows应用程序的接口。可视化组件库是用对象Pascal编写的。它主要是为使用Borland而开发的&#xff0c;它具有与Delphi以及…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果

自动设置服务器全教程

亲爱的爬虫探险家&#xff01;在网络爬虫的世界里&#xff0c;自动设置代理服务器是一个非常有用的技巧。今天&#xff0c;作为一家代理服务器供应商&#xff0c;我将为你呈上一份轻松实用的教程&#xff0c;帮助你轻松搞定爬虫自动设置代理服务器。 一、为什么需要自动设置代…

SMC状态机 讲解2 从模型到SMC

SMC状态机 讲解2 从模型到SMC 1、实例化有限状态机&#xff08;FSM)2、简单转换 Simple Transition3、外部环回转换 External Loopback Transition4、内部环回转换 Internal Loopback Transition5、转换动作6、转换Guard7、转换参数8、Entry 和 Exit动作9、Push 转换10、Pop转换…

chatGPT界面

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…

jenkins Linux如何修改jenkins 默认的工作空间workspace

由于jenkins默认存放数据的目录是/var/lib/jenkins&#xff0c;一般这个var目录的磁盘空间很小的&#xff0c;就几十G,所以需要修改jenkins的默认工作空间workspace 看到最后 环境 jenkins使用yum安装的 centos 7 正题 1 查看jenkins安装路径 [rootlocalhost jenkins_old_d…

Git 安装、配置并把项目托管到码云 Gitee

错误聚集篇&#xff1a; 由于我 git 碰见大量错误&#xff0c;所以集合了一下&#xff1a; git 把项目托管到 码云出现的错误集合_打不着的大喇叭的博客-CSDN博客https://blog.csdn.net/weixin_49931650/article/details/132460492 1、安装 git 1.1 安装步骤 1.1.1 下载对应…

网络渗透day2-Windows服务器服务管理相关

1.在Windows Server中&#xff0c;用于监视网络连接和流量的工具是&#xff1f; A.Event Viewer B.Performance Monitor C.Task Scheduler D.Resource Monitor 正确答案&#xff1a;D 你的答案&#xff1a;B 解析&#xff1a; 答案解析&#xff1a;Resource Monitor用于监…

2分钟搭建自己的GPT网站

如果觉得官方免费的gpt&#xff08;3.5&#xff09;体验比较差&#xff0c;总是断开&#xff0c;或者不会fanqiang&#xff0c;那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度&#xff0c;4.1号后注册的就没有额度了。不过也可以自己充值。 有了…

数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成

数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成 目录 数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成&#xff1b; 2.马尔科夫链蒙特卡洛方…

使用Vscode调试shell脚本

在vcode中安装bash dug插件 在vcode中添加launch.json配置&#xff0c;默认就好 参考&#xff1a;http://www.rply.cn/news/73966.html 推荐插件&#xff1a; shellman(支持shell,智能提示) shellcheck(shell语法检查) shell-format(shell格式化)