Linux--信号量

2023-11-09

1.信号量的定义:

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

加一减一是一个原子操作;

2.临界资源和临界区的概念:

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

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

3.信号量的一个例子:

不加控制模拟使用打印机:

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

4.代码:

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);
	}
}

信号:

 信号量用处

//运行的时候:./a& ./b&

目的:A,B成对出现

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

Linux--信号量 的相关文章

  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • Qt框架分析

    以Qt5 6 0为例 类结构 先分析qt gui程序最常用的两个大类QApplication和QWidget的继承关系 如下 在分析QApplication和QWidget的构造过程 如下 结合继承关系和构造过程分析类结构 以QObject
  • 蓝桥杯之python基础

    蓝桥杯之python基础 一 问题与学习 二 python基础的关键知识点 2 1 Python 标识符 2 2 行和缩进 2 3 多行语句 2 4 python引号 2 5 python注释 2 6 python空行 2 7 等待用户输入
  • Postman添加公用url

    1 点击右上角的这个图标 2 点击Add 3 在Add Environment中输入环境名称 下面输入相关参数 4 用两层大括号即可使用 如 http base url login
  • OpenGL纹理映射总结

    大概步骤 1 创建纹理对象 并为他指定一个纹理 2 确定纹理如何应用到每个像素上 3 启用纹理贴图 4 绘制场景 提供纹理和几何坐标 过滤 由于我们提供的纹理图像很少能和最终的屏幕坐标形成对应 大小不同 所以需要设置过滤项目 允许我们进行插
  • cef支持高分辨率去除黑边

    解决方案 1 在当前电脑的桌面 右键 显示设置 把显示比例调整为100 需要重启电脑生效 这时再看 显示就正常了 2 在当前项目中 添加一个 应用程序清单文件 app manifest 在根节点 assembly 下 添加以下代码 重新运行
  • 【Flutter 问题系列第 74 篇】在 Flutter 中如何对 Uint8List 和 File 类型的图像数据进行压缩

    这是 Flutter 问题系列第 74 篇 如果觉得有用的话 欢迎关注专栏 文章目录 一 问题描述 二 引入 获取依赖 三 根据数据类型指定压缩方式 3 1 Uint8List Uint8List 3 2 File File 3 3 Fil
  • 使用tf.keras实现多层感知器(神经网络)的代码实现(tensorflow2.0基础入门2)

    逻辑回归与交叉熵 1 线性回归预测的是一个连续的值 2 逻辑回归给出的 是 和 否 的回答 3 逻辑回归的激活函数 采用的是 sigmoid激活函数 sigmoid函数是一个概率分布函数 即给定某个输入 它将输出为一个0到1的概率值 4 对
  • C语言入门日记

    参考 C语言入门日记 作者 9art0 发布时间 2020 08 30 16 37 46 网址 https blog csdn net GatoWong article details 108307915 spm 1001 2014 300
  • EOL while scanning string literal问题之谜

    运行以下脚本又遭遇 EOL while scanning string literal问题 coding utf 8 import arcpy import os import os path inWorkspace arcpy GetPa
  • 拓展卢卡斯定理模板完整注释

    define CRT SECURE NO WARNINGS include
  • matlab 形态学 颗粒,使用Matlab进行形态学操作

    Here is the problem A camera takes an image I of a penny a dime and a quarter lying on a white background and the coins
  • vs 中出现LINK : fatal error LNK1104: 无法打开文件“Qt5Networkd.lib”解决办法

    可以看到出现链接问题 原因是缺少Qt5Networkd库文件 解决办法如下 打开 项目 gt 属性 gt C C gt 常规 gt 附加文件目录 添加 QTDIR include QtNetwork 添加完后看看计算的值里面的路径是否存在添
  • 关于单片机位数的思考(8位、16位、32位)

    关于单片机位数的思考 8位 16位 32位 8位 16位 32位是指单片机的 字长 也就是一次运算中参与运算的数据长度 这个位是指二进制位 以8位为例 8位二进制的表达范围是0000 0000 1111 1111即十进制的0 255 即每次
  • 【Python】Pandas DataFrame 一维表二维表的转换

    目录 一 stack unstack unstack 将一维表转换为二维表 stack 将二维表转换为一维表 二 pivot melt pivot 将一维表转换为二维表 melt将二维表转换为一维表 Tips 用pandas处理数据 我们经
  • angularJS1笔记-(3)-购物车增删改查练习

    html div class container table class table table div
  • linux驱动开发(四):ioctl()函数

    前文中我们介绍了应用程序通过使用虚拟文件系统VFS提供的接口 来控制字符驱动程序 完成字符驱动设备的open close read write操作 但是如果我们想进行除此以外的其他操作 拓展一些file operations给出的接口中没有
  • 实时目标追踪:ByteTrack算法步骤详解和代码逐行解析

    文章目录 ByteTrack算法简介 算法步骤分析 算法框架流程 一 对追踪轨迹和边界框进行分类 二 对轨迹进行第一次追踪 仅针对激活状态的轨迹的高分匹配 三 对轨迹进行第二次追踪 仅针对激活状态的轨迹的低分匹配 四 对未激活状态的轨迹进行
  • 电脑提示找不到MSVCR120.dll 简单解决方法,亲测有效!

    msvcr120 dll是windows系统的一部分 它是Windows操作系统中的一个动态链接库文件 该文件包含了一些在运行使用了C 语言编写的程序时所需的函数和资源 当系统无法找到或加载msvcr120 dll文件时 会导致相关程序无法
  • 学Vue和Node.js的一点感想-[2019-01-03 10:38]

    这几天公司换了前端框架 就是打算使用Vue Vuetifyjs 来构建前端 稀里糊涂的学了点Node js 在这里记录一下感想 Vue说是是一套构建用户界面的渐进式框架 Vue 只关注视图层 采用自底向上增量开发的设计 Vue 的目标是通过
  • Linux--信号量

    1 信号量的定义 信号量是一个特殊的变量 一般取正数值 它的值代表允许访问的资源数目 获取资源时 需要对信号量的值进行原子减一 该操作被称为p操作 当信号量值为0时 代表没有资源可用 p操作会阻塞 释放资源时 需要对信号量的值进行原子加一