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--信号量 的相关文章

  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs

随机推荐

  • 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操作会阻塞 释放资源时 需要对信号量的值进行原子加一