sem_init函数用法

2023-11-19

sem_init函数

  • sem_init函数是Posix信号量操作中的函数。sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享。如果 pshared 的值为 0,那么信号量将被进程内的线程共享,并且应该放置在这个进程的所有线程都可见的地址上(如全局变量,或者堆上动态分配的变量)。

  • 如果 pshared 是非零值,那么信号量将在进程之间共享,并且应该定位共享内存区域(见 shm_open(3)、mmap(2) 和 shmget(2))。因为通过 fork(2) 创建的孩子继承其父亲的内存映射,因此它也可以见到这个信号量。所有可以访问共享内存区域的进程都可以用 sem_post(3)、sem_wait(3) 等等操作信号量。初始化一个已经初始的信号量其结果未定义。

  • 返回值
    sem_init() 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。

  • 用下面一组函数(系统调用)来实现。


int sem_init(sem_t *sem,int pshared,unsigned int value); 
int sem_destroy(sem_t *sem); 
int sem_wait(sem_t *sem); 
int sem_trywait(sem_t *sem); 
int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem); 

具体要Include什么头文件,在你的系统上man sem_init吧。
这组函数是POSIX标准的无名信号量函数,另外还有具名信号亮,这个嘛,等下回再说。
第一个参数:信号量名
看一个例子,比如有两个线程都要往打印机上打东西,但是同一时刻只能打一个。
那么首先用sem_init初始化一个信号量,注意pshared表示允许几个进程共享该信号量,一般设0用于进程内的多线程共享,要看是否支持进程共享,请查看下你的系统的man手册。
第三个参数value表示可用的资源的数目,即信号灯的数目,咱们这儿只有1个打印机所以设成1。
然后线程调用sem_wait取获取这个信号灯,第一个线程一看,有1个,他就拿到了,然后可以继续后继操作,此时信号灯自动减1,变成0个。那么第二个线程调用sem_wait时就会阻塞在这儿了。
第一个线程完成打印后,调用sem_post释放信号灯,信号灯数目变成1,将会唤醒等待的第二个线程,然后第二个线程接着打印。
最后当所有任务完成后,主线程调用sem_destroy释放这个信号量。

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

sem_init函数用法 的相关文章

  • 如何与其他进程共享现有的 char * ?

    我正在尝试使用其他分叉 执行的进程共享一些内存shmget and shmat char test test int shID char shptr key t shkey 2404 shID shmget shkey sizeof cha
  • 在 Java 中强制虚假唤醒

    这个问题不是关于虚假唤醒是否真的发生 因为这已经在这里进行了详细讨论 Java 中的虚假唤醒真的会发生吗 https stackoverflow com questions 1050592 do spurious wakeups actua
  • IPv4 到十进制不同的值?

    为什么 inet pton 和 inet addr 1734763876 的 IPv4 十进制值与使用这 2 个网站 1684366951 得到的值不同 struct sockaddr in sin inet pton AF INET 10
  • getaddrinfo:如果指定了节点名,AI_PASSIVE 以什么方式被忽略?

    引用自规格获取地址信息 http pubs opengroup org onlinepubs 009695399 functions freeaddrinfo html If the AI PASSIVE如果指定了标志 则返回的地址信息应适
  • 在 C 中编译/匹配 POSIX 正则表达式

    我正在尝试匹配字符串中的以下项目pcode u后跟 1 或 2 位数字 phaseu phasep x 被非单词字符包围 y 被非单词字符包围 z 被非单词字符包围 我尝试使用 POSIX 正则表达式函数 如下所示 实现正则表达式匹配 但有
  • 测试 POSIX shell 合规性?

    如何测试 shell 脚本以验证它是否符合 POSIX 标准 我有大量为各种版本的 Bash 和可能的其他 shell 编写的脚本 我希望能够确定哪些完全符合 POSIX 标准 哪些不符合 理想情况下 我想找到类似的东西lint但对于 sh
  • 什么是“命名空间清洁度”,glibc 是如何实现的?

    我从以下地方看到这一段 zwol 的回答 https stackoverflow com a 57728805 10795151最近 The libc 前缀于read是因为实际上有三个不同的名称read在 C 库中 read read an
  • 为什么子进程在unix中返回退出状态= 32512?

    在我的程序中 我正在执行给定的命令并获取结果 日志和退出状态 另外 我的程序必须支持 shell 特定命令 即包含 shell 特定字符 tild pipe 的命令 但当我尝试跑步时sh c ls wc通过我的程序在我的主目录中失败 其退出
  • 检测 stdout 是否重定向到管道(而不是文件、字符设备、终端或套接字)?

    理想情况下 这可以在 shell 中编写脚本 但 Perl 或 Python 也可以 C 代码可能会有帮助 但可能不符合成本 效益 我认识到重定向到 FIFO 命名管道 可能与真实管道无法区分 这已经是我并不真正关心的边缘情况了 严格的 P
  • //什么是路径,它与/有什么不同

    我们知道根目录是 根据posix 还有另一个与 不同的目录 当您 ls 和 ls 时 输出是相同的 就像 stat 一样 但是如果您 cd 和 cd 它们是不同的 尽管目录内容相同 这真的让我很困惑 有人得到答案吗 From Bash FA
  • 如何从 POSIX 文件描述符构造 C++ fstream?

    我基本上是在寻找 fdopen 的 C 版本 我对此做了一些研究 这是看起来应该很容易但事实证明非常复杂的事情之一 我是否在这个信念中遗漏了一些东西 即它真的很容易 如果没有 是否有一个好的图书馆可以处理这个问题 编辑 将我的示例解决方案移
  • POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?操作系统的做法是什么?

    当我们的 UNIX C 程序需要紧急退出时 我们使用 exit 3 函数并安装 atexit 3 处理程序来进行紧急清理 这种方法工作得很好 直到我们的应用程序被线程化 此时 atexit 处理程序停止正常工作 我们通过试验了解到一个错误
  • OSX 上的单调时钟

    CLOCK MONOTONIC似乎不可用 所以clock gettime已经出局了 我在一些地方读到 mach absolute time 可能是正确的方法 但在读到它是一个 cpu 相关值 后 它立即让我想知道它是否在下面使用 rtdsc
  • Python:“导入 posix”问题

    如果我导入os模块 我可以运行以下命令来推断 os py 的位置 gt gt gt import os gt gt gt print os file usr lib python2 6 os pyc 但是 当我导入时posix 它不具有 f
  • C库函数获取活动线程数

    我正在用 C 语言开发一个多线程 Unix 应用程序 有没有一种简单的方法来获取同时活动线程的数量 如果库已经可以为我完成的话 我不想编写代码来跟踪活动线程的数量 我正在使用 POSIX pthreads 并且我正在尝试为 Unix 和类
  • 在 Perl 中使用 POSIX ceil() 出现意外结果

    我一生都无法弄清楚为什么以下会产生这样的结果 use POSIX my g 6 65 my t g 4 my r t g my n r g my c ceil n print c n n 我知道印记太棒了 抱歉 我已经为我的应用程序解决了这
  • dev_t 和 ino_t 是否必须是整数类型?

    glibc 的文档保留它们是整数类型 不比 unsigned int 窄 但我没有找到说明它们必须是整数类型的标准参考 另请参阅 time t 所以最后 问题就变成了 include
  • 如果 POSIX 系统上不存在目录,是否有办法自动创建该目录?

    POSIX 系统上是否有任何方法可以仅在目录尚不存在时才自动创建该目录 如同 int fd open path to file O CREAT O EXCL O RDWR 0644 这不起作用 int dfd open path to di
  • 如何从 POSIXct 对象获取原点

    我有一个像这样的函数 foo function time in code here that changes POSIXct to numeric time out as POSIXct time in origin 1970 01 01
  • 什么是 POSIX 合规性以及它对我有何影响?

    我不断看到这个问题出现 每次我查找它时 我都无法很好地解释它是什么或它对我意味着什么 什么是 POSIX 合规性 假设我的程序仅在兼容 POSIX 的机器上运行 这对我作为程序员来说有何简化 甚至吗 POSIX http pubs open

随机推荐