Linux——信号量(定义、示例、信号量接口、ipcs命令)

article/2025/10/7 16:30:25

目录

1、信号量

2、信号量举例

3、信号量的接口

4、通过控制进程来完成打印机操作

5、ipcs命令

1、信号量

  • (1)定义:​​​​​​
  • 信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源时,需要对信号量的值进行原子减一,该操作被称为Р操作。
  • 当信号量值为О时,代表没有资源可用,Р操作会阻塞。释放资源时工需要对信号量的值进行原子加一,该操作被称为V操作。信号量主要用来同步进程。
  • 信号量的值如果只取0,1,将其称为二值信号量。如果信号量的值大于1,则称之为计数信号量。
  • 注意:正数值;加一减一是一个原子操作;
  •      (原子操作:信号量+1 -1,不能被打断)

(2)临界资源和临界区的概念

①临界资源:指计算机的软硬件资源;同一时刻,只允许进程或者线程访问的资源。

②临界区:访问临界资源的代码段。

2、信号量举例

  • 不加控制模拟使用打印机
  • 题目:进程a和进程b模拟访问访问打印机,进程a输出第一个字符'a'表示开始使用打印机,输出第二个字符’a‘表示结束使用,b进程操作与a进程相同。
  • (由于打印机同一时刻只能被一个进程使用,所以输出结果不应该出现abab这样交替的结果)。

//进程a.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>int main()
{
int i=0;for(;i<5;i++){printf("A");fflush(stdout);int n=rand()%3;sleep(n);printf("A");fflush(stdout);n=rand()%3;sleep(n);}
}
//进程b.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>int main()
{int i=0;for(;i<5;i++){   printf("B");fflush(stdout);int n=rand()%3;sleep(n);printf("B");fflush(stdout);n=rand()%3;sleep(n);}   
}

 如果不加控制,两个进程运行结果:

3、信号量的接口

(1)semget

  • int semget(key_t key,int nsems,int semflg);//创建或者获取一个已经存在的信号量
  • //key:给相同的key值,能得到相同的信号量
  • //nsems:创建几个信号量;
  • //semflg:标志位;如果为创建:IPC_CREAT;
  • //如果为全新创建,也就是不知道是否有人创建过,则IPC_CREATE|IPC_EXCL,就是如果

         没有则创建,如果有则创建失败 ;

(2)semop

  • int semop(int semid,struct sembuf *sops,unsigned nsops);//对信号量进行改变,做P操作或者V操作;
  • //semid:信号量的id号,也就是刚才semget的返回值;说明对哪个信号量进行操作;
  • //sops:结构体指针,指向sembuf的结构体指针,sembuf结构体有三个成员变量:

      ①sem_num表示信号量的编号(即指定信号量集中的信号量下标);

      ②sem_op表示是p还是v操作;

      ③1为v操作。

注意:(加1),-1为p操作(减1);

           sem_flg为标志位;
(3)semctl

  • int semctl(int semid,int semnum,int cmd,...);//对信号量进行控制:初始化/删除信号量
  • semid:信号量id;
  • semnum:信号量编号;
  • cmd:命令:SETVAL:初始化信号量;
  • IPC_RMID:删除信号量;

**注意**:联合体semun,这个联合体需要自己定义;

4、通过控制进程来完成打印机操作

(不存在abab交替打印)

思路: 在打印前进行p操作和v操作。

5、ipcs命令

  • (1)查看信号量和消息队列,共享内存:ipcs
  • (2)只查看所有的信号量:ipcs -s
  • (3)只查看所有的共享内存:ipcs -m
  • (4)显示所有消息队列:ipcs -q
  • (5)显示最近访问过IPC设施的进程ID ipcs -p ipcs -m -p ipcs -q -p
  • (6)显示IPC设施的最后操作时间

                 ipcs -t

                 ipcs -q -t

                 ipcs -m -t

                 ipcs -s -t

  • (7)显示IPC设施的当前状态

                  ipcs -u

  • (8)显示IPC设施的权限关系

                  ipcs -c

                  ipcs -m -c

                  ipcs -q -c

                  ipcs -s -c

  • (9)显示IPC设施的详细信息

                  ipcs -q -i id

 注意:id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。

  • (10)显示所有的IPC设施

                  ipcs -a

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!


http://chatgpt.dhexx.cn/article/lZMEr2dl.shtml

相关文章

什么是IPC?

目录 IPC的简介&#xff1a; IPC的主要功能模块&#xff1a; IPC信号处理过程&#xff1a; IPC硬件构成&#xff1a; IPC的简介&#xff1a; IPC&#xff1a;是IP Camera的简称。它是在前一代模拟摄像机的基础上&#xff0c;集成了编码模块后的摄像机。它和模拟摄像机的区别…

IPC是什么?

IPC是什么&#xff1f; ipc是IP Camera的缩写词&#xff0c;IP是网际协议&#xff0c;Camera是照相机、摄影机&#xff0c;IP Camera顾名思义就是网络摄像机&#xff0c;它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。 网络摄像机又叫IP CAMERA&#xff08;简称IP…

linux ipcs命令详解

进程间通信概述 进程间通信有如下的目的&#xff1a;1、数据传输&#xff0c;一个进程需要将它的数据发送给另一个进程&#xff0c;发送的数据量在一个字节到几M之间&#xff1b;2、共享数据&#xff0c;多个进程想要操作共享数据&#xff0c;一个进程对数据的修改&#xff0c…

ipcs 命令

在unix/linux下&#xff0c;查看共享内存、信号量&#xff0c;队列等共享信息 相应的命令是ipcs [-m|-s|-q] -m列出共享内存&#xff0c;-s列出共享信号量&#xff0c;-q列出共享队列 清除命令是 ipcrm [-m|-s|-q] $id -m 删除共享内存&#xff0c;-s删除共享信号量&#xff0…

Linux的IPC命令

进程间通信概述 进程间通信有如下的目的&#xff1a;1、数据传输&#xff0c;一个进程需要将它的数据发送给另一个进程&#xff0c;发送的数据量在一个字节到几M之间&#xff1b;2、共享数据&#xff0c;多个进程想要操作共享数据&#xff0c;一个进程对数据的修改&#xff0c;…

Linux--ipcs、共享内存、共享接口简介

1.ipcs命令 ipcs -s: 只查看信号量 ; ipcs -m: 只查看共享内存 ; ipcs -q: 只查看消息队列 ; 删除信号量 : ipcrm -s 编号 ; 2.共享内存 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物 理内存上申请一块空间&#xff0c;多个进程可以将其…

Linux系统中ipcs命令的使用

ipcs命令的学习 多进程间通信常用的技术手段包括共享内存、消息队列、信号量等等。 ipcs 命令的用途主要用于报告进程间通信设施状态。 ①查看帮助&#xff1a; ipcs -help ②查看所有资源&#xff08;设施&#xff09;&#xff1a; ipcs -a 或 ipcs ③三类资源单独查看方式 …

C++的access()函数

文章目录 函数功能头文件函数原型参数说明示例access函数详解 函数功能 确定文件是否存在或者判断读写执行权限&#xff1b;确定文件夹是否存在即&#xff0c;检查某个文件的存取方式&#xff0c;比如说是只读方式、只写方式等。如果指定的存取方式有效&#xff0c;则函数返回…

access数据库

经过连续几天的学习&#xff0c;初步了解access数据库。以下是知识点的总结&#xff0c;对应刚刚学习的人会很有帮助。 ADO.NET是数据的访问架构 它主要包括 connection,command,datareader,dataadapter,dataset,datatable等六个对象 一、connection 作用&#xff1a;连接数…

Access数据库对象包括哪六个?Access与 Excel 最重要的区别是什么?

我们知道微软有两款经典的数据处理软件&#xff1a;Excel和Access。 由于在运行大量数据时&#xff0c;Excel会卡得让你怀疑人生&#xff0c;Access却轻松运转。所以很多人说他俩的时候&#xff0c;大都总结&#xff1a; “小规模数据用Excel&#xff0c;大规模数据用Access。…

access/_access函数

Linux下 1&#xff0c;头文件&#xff1a; #include <unistd.h>2&#xff0c;函数的声明&#xff1a; int access(const char *pathname, int mode);3&#xff0c;函数的作用&#xff1a; access函数用来判断指定的文件或目录是否存在(F_OK)&#xff0c;已存在的文件或…

Linux access函数讲解

函数&#xff1a; #include<unistd.h> int access(const char* pathname, int mode); 参数介绍&#xff1a; pathname 是文件的路径名文件名 mode&#xff1a;指定access的作用&#xff0c;取值如下 F_OK 值为0&#xff0c;判断文件是否存在X_OK 值为1&#xff0c;判…

C语言中access/_access函数的使用

在Linux下&#xff0c;access函数的声明在<unistd.h>文件中&#xff0c;声明如下&#xff1a; int access(const char *pathname, int mode); access函数用来判断指定的文件或目录是否存在(F_OK)&#xff0c;已存在的文件或目录是否有可读(R_OK)、可写(W_OK)、可执行(X…

C语言:access函数的使用

C语言&#xff1a;access函数的使用 一、access()函数用来判断用户是否具有访问某个文件的权限(或判断某个文件是否存在). 二、需要包含#include<unistd.h> 三、参数和返回值 int access(const char *pathname,int mode) 参数: pathname:表示要测试的文件…

gremlin

g.V().hasLabel(Person).outE(Knows) inE()

复杂Gremlin查询的调试方法

复杂Gremlin查询的调试方法 摘要: Gremlin是图数据库查询使用最普遍的基础查询语言。Gremlin的图灵完备性&#xff0c;使其能够编写非常复杂的查询语句。对于复杂的问题&#xff0c;我们该如何编写一个复杂的查询&#xff1f;以及我们该如何理解已有的复杂查询&#xff1f;本文…

Gremlin基本使用

Gremlin简介 Gremlin是Apache TinkerPop 框架下的图遍历语言。Gremlin是一种函数式数据流语言&#xff0c;可以使得用户使用简洁的方式表述复杂的属性图&#xff08;property graph&#xff09;的遍历或查询。每个Gremlin遍历由一系列步骤&#xff08;可能存在嵌套&#xff09…

Gremlin语法学习笔记

hugegraph查询使用Gremlin语法&#xff0c;打开 hugegraph-studio http://10.0.0.50:18088&#xff0c;更详细的方法参考 http://kelvinlawrence.net/book/Gremlin-Graph-Guide.html#fuzzyregs 导入数据&#xff0c;jar包参考 https://git.gtapp.xyz/ml/graph-user&#xff0c…

从零开始Gremlin学习

从零开始Gremlin学习 创建schema和图 以下面这个ThinkerPop关系图为例 在建图之前&#xff0c;首先需要创建schema&#xff0c;创建的schema有属性、节点、和边缘&#xff0c;正常情况下是按照属性->节点->边缘&#xff0c;因为在定义及节点label的时候需要有属性&…

基于Gremlin语言图数据库查询的优化

图谱结构&#xff1a; 其中query标签的结构&#xff1a; 列名类型说明idinteger唯一主键classstring类别 a_[a|b|c|d|e|f]标签的结构 列名类型说明idinteger唯一主键classstring类别&#xff0c;关联到query的类别namestring名称 b_[a|b|c|d|e|f]标签的结构 列名类型说明id…