linux信号量

2023-05-16

1.信号量数据结构

union semun
{
    int val;            //整形变量--信号量初值
    struct semid_ds *buf;    //semid_ds结构指针
    unsigned short *array;    //数组类型
    struct seminfo *_buf;    //信号量内部结构
};

2.新建信号量

#include<sys/types.h>
#incldue<sys/ipc.h>
#include<sys/sem.h>
int semget(key_t key,int nsems,int semflg);
key=>ftok生成的键值
nsems=>指定新的集合中创建信号量的数目
semflg=>打开信号量的方式,取值如下:
IPC_CREAT:没有该信号量就创建,有就返回该信号量的标识符
IPC_CREAT|IPC_EXCL:没有即创建,有返回-1(创建失败)

3.信号量操作函数

​

#include<sys/types.h>
#incldue<sys/ipc.h>
#include<sys/sem.h>
int semop(int semid,struct sembuf *sops,unsigned nsops);
semid操作信号量id
sops指向要在信号量集合上操作的一个数组
nsops该数组中操作的个数


struct sembuf
{
    ushort sem_num;    //    信号量编号
    short sem_op ;       //信号量的操作(P或者V)
    short sem_flg;    //信号量的操作标志
};

4.信号量控制函数

​

#include<sys/types.h>
#incldue<sys/ipc.h>
#include<sys/sem.h>
int semctl(int semid,int semnum,int cmd,....);  //信号量集合上执行控制操作
semid通过semget得到
semnum是信号量集合的索引值
cmd操作命令,取值如下:
IPC_STAT:获取某个集合的semid_ds结构
IPC_SET:设置某个集合的semid_ds结构中ipc_perm值
IPC_RMID:从内核中删除某信号
GETALL:获取集合中所有信号量的值
GETNCNT:返回当前正在等待资源的进程数目
GETPID:返回最后一次执行semop调用进程的pid
GETVAL:返回集合中某个信号量的值
GETZCNG:返回正在等待资源利用率达到百分之百的进程数目
SETALL:把集合中的所有信号量的值,设为联合体array成员包含的对应值
SETVAL:设置带个

5.信号的一个例子

#include<sys/types.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<stdio.h>
union semun
{
        int val;
        struct semid_ds *buf;
        unsigned short *array;
};
int creatsem(key_t key,int value)

{
    union semun sem;
        int semid;
        sem.val=value;
        semid=semget(key,0,IPC_CREAT);
        if(-1==semid)
                printf("creat sem failed!\n");
        semctl(semid,0,SETVAL,sem);
        return semid;
}
int getvaluesem(int semid)
{
        union semun sem;
        int p;
        p=semctl(semid,0,GETVAL,sem);
        if(p==-1)
        {       printf("get failed!\n");
                return -999;
        }
        else return p;
}
void DESTROY(int semid)
{
        union semun sem;
        sem.val=0;
        semctl(semid,0,IPC_RMID,sem);
}
void Sem_V(int semid)
{
        struct sembuf sops={0,+1,IPC_NOWAIT};
        semop(semid,&sops,1);
}
void Sem_P(int semid)
{
        struct sembuf sops={0,-1,IPC_NOWAIT};
        semop(semid,&sops,1);
}

int main()
{
        key_t key;
        int semid;
        char i;
        int ret=0;
        int value=0;
        key=ftok("/home/18",'a');
        if(key==-1)
                printf("failed to creat key!\n");
        semid=creatsem(key,100);
        if(semid==-1)
                printf("create sem failed!\n");
        printf("the value is %d\n",value);
        for(i=0;i<=3;i++)
        {
                Sem_P(semid);
        value=getvaluesem(semid);
        printf("信号量的值为:%d\n",value);
                Sem_V(semid);
        value=getvaluesem(semid);
        printf("信号量的值为:%d\n",value);
        }
        DESTROY(semid);
        return 0;
}

6.结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux信号量 的相关文章

随机推荐

  • 如何离线安装python包

    在我们的日常使用python的过程中 xff0c 通常是通过联网安装相关的依赖包 xff0c 但是有时候会有一些情况是没有网络的 xff0c 但我们又需要安装python的各种包 而包的依赖导致我们很难一个一个地从pypi网站下载whl文件
  • mavros 环境配置注意事项[Resource not found: px4 ROS path ]

    背景 我最近开始使用mavros xff0c 按照官网的教程进行安装 采用二进制的方式安装 xff0c 一切进行的很顺利 xff0c 接下来我就按照PX4官网的去执行一个让无人机自动起飞的例子 xff0c 完全按照官网的代码和配置到最后一步
  • rosdep init ERROR: cannot download default sources list... 解决方法

    问题描述 如标题所示 xff0c 当我们安装好ROS后 xff0c 想要用rosdep初始化时 xff0c 会遇到ERROR cannot download default sources list from https raw githu
  • Linux 运行命令时修改.bashrc并结束命令时恢复原样

    问题来源 我有一个bash程序 xff0c 想要在执行该程序的时候修 bashrc xff0c 然后更新一些环境变量 xff0c 并在结束 ctrl 43 c 的时候再把程序恢复原样 操作如下 xff1a echo 命令把想要增加的内容写入
  • 数字信号处理实验(一)

    实验目的 本次实验目的为 xff1a 在matlab环境下产生几种基本的数字信号 xff0c 并对这些基本的信号进行运算和变换 xff0c 同时利用程序结果对采样定理进行验证 xff0c 深刻理解采样定理 通过自己录制音频信号并对不同的音频
  • 数字图像处理实验(二)

    实验目的 实验一 xff1a 图像增强 了解图像增强的目的及意义 xff0c 加深对图像增强的感性认知 1 掌握直接灰度变换的图像增强方法 2 掌握灰度直方图的概念及其计算方法 3 掌握直方图均衡化合直方图规定化得计算过程 实验二 xff1
  • 信息论实验-信源编码2(Lz编码和算数编码的C++实现)

    上一篇文章给出了Huffman编码和Shannon Fano编码的编码原理以及C 43 43 的程序 xff0c 程序可以用来实现给任意类型的文件进行无损压缩 xff0c 缺点是比较耗时 xff0c 不能作为正常的通用压缩软件来使用 xff
  • 信息论实验-二元对称信道仿真(C++实现)

    二元对称信道模拟器 实验目的 加深理解二进制对称信道的工作原理 xff0c 掌握通过高级编程语言生成伪随机数的方法 允许使用编程语言 xff1a C xff0c C 43 43 等 实验要求 输入 xff1a BSC信道的错误概率 xff0
  • OpenCV 安装必看

    怎样安装OpenCV套件呢 xff1f 想要使用opencv的同学一定是刚刚接触到图像处理 xff0c 需要做一些实验 xff0c 听说OpenCV很好用 xff0c 所以就开始查找各种资料学习OpenCV但是 xff0c 谁告诉你们它很好
  • make: *** No rule to make target `menuconfig'. Stop.问题解决方案-Linux(3)

    前言 本问题是我在编译更新内核时所遇到的 xff0c 已经解决 问题描述 在编译内核时 xff0c 运行make menuconfig 时出现 xff0c 截图如下 这个是因为没有找到要配置的文件 解决方案 进入解压得到的Linux原文件夹
  • 深入理解AlexNet网络

    AlexNet 论文 xff1a ImageNet Classification with Deep Convolutional Neural Networks 第一个典型的CNN是LeNet5网络结构 xff0c 但是第一个引起大家注意的
  • Ubuntu 18.04 网络配置

    坑爹的网络配置 ubuntu 18 04的网络配置的方式相较于原来的版本有了很大的改动 xff0c 并且server版的和Desktop 版本的是不一样的 Server版本 新的版本采用了netplan 管理网络 xff0c 在命令行中配置
  • PCA原理

    PCA 各位 xff0c 久违了 xff5e 什么是PCA xff1f 什么是PCA呢 xff1f 这是一个问题 xff0c 什么样的问题 xff1f 简单而又复杂的问题 xff0c 简单是因为百度一下就会出现一大堆的解释 xff0c 复杂
  • SRAM驱动开发实例

    一 我写博客的原因 xff0c 应该说是有两点吧 xff08 1 xff09 一点是对阶段性工作的总结 xff0c 虽说技术创新 xff0c 技术创新 xff0c 但在创新之前有一个技术积累的过程 xff0c 写博客 xff0c 便于总结
  • 互补滤波器

    互补滤波器 从 RC 电路 到 数字滤波器 参考 xff1a wikiPedia by luoshi006 原理 低通滤波器 一阶低通滤波器 传递函数 常见的 RC 电路构成的一阶低通滤波器的输入 U 输出 Y 关系如下 xff1a Y U
  • mahony 互补滤波器

    by luoshi006 上接 互补滤波器 xff0c 继续学习互补滤波 参考 xff1a Keeping a Good Attitude A Quaternion Based Orientation Filter for IMUs and
  • PX4 - position_estimator_inav

    by luoshi006 参考 xff1a 1 http dev px4 io advanced switching state estimators html 2 http blog sina com cn s blog 8fe4f2f4
  • PX4-terrain_estimator

    by luoshi006 参考 xff1a https github com PX4 Firmware blob master src lib terrain estimation terrain estimator h PX4 位置估计中
  • 已归档博文收纳

    by luoshi006 欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a L类 Learning GitHub Qt5 5 1 43 OpenCV2 4 10 环境配置PX4 开发环境 xff08 Ubuntu14
  • linux信号量

    1 信号量数据结构 union semun int val 整形变量 信号量初值 struct semid ds buf semid ds结构指针 unsigned short array 数组类型 struct seminfo buf 信