semaphore,sem_init的问题

发布于 2022-10-15 07:02:14 字数 2053 浏览 17 评论 0

命名的semaphore基本会用,但是想在父子进程间用匿名的semaphore,用了这个sem_init,但是没起作用。估计是我没理解对这个东西。请懂的朋友赐教。

我是想父进程scanf等待输入的时候,子进程不会一直打印1,2; 而子进程打印1,2的过程中,父进程不会让你input。

  1. int main(int argc, char** argv){
  2.         sem_t mutex;
  3.         sem_init(&mutex, 1, 1);
  4.         char buffer[100];
  5.         pid_t pid;
  6.         pid = fork();
  7.         if(pid == 0){
  8.                 while(1){
  9.                         sem_wait(&mutex);
  10.                         printf("1\n");
  11.                         sleep(1);
  12.                         printf("2\n");
  13.                         sem_post(&mutex);
  14.                 }
  15.         }
  16.         else{
  17.                 while(1){
  18.                         sem_wait(&mutex);
  19.                         printf("input:");
  20.                         scanf("%s",buffer);
  21.                         sem_post(&mutex);
  22.                 }
  23.         }
  24. }

复制代码运行的结果是,父子进程依然各干各的事,没有互相等待。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

微暖i 2022-10-22 07:02:14

sem_init的man page里有一段话,不知道与这个问题是否有关?

       sem_init initializes the semaphore object pointed to by sem.  The count
       associated  with  the semaphore is set initially to value.  The pshared
       argument indicates whether the semaphore is local to the  current  pro-
       cess  ( pshared is zero) or is to be shared between several processes (
       pshared is not zero). LinuxThreads currently does not support  process-
       shared  semaphores
,  thus  sem_init always returns with error ENOSYS if
       pshared is not zero.

幸福丶如此 2022-10-22 07:02:14

关注,来学习

独守阴晴ぅ圆缺 2022-10-22 07:02:14

这个你需要了解下fork时对POSIX unnamed semaphores.如果你的匿名信号量是在共享内存(比如匿名映射所创建的共享内存)中,那这个匿名信号量会被父子进程共享,否则的话子进程会拷贝一份匿名信号量。也就是说你的父子进程中所操作的根本不是同一个匿名信号量,所以你这样是不行的

ヅ她的身影、若隐若现 2022-10-22 07:02:14

shm_open共享内存我知道,那请问如果能把这个semaphore放在共享内存区呢?

守望孤独 2022-10-22 07:02:14

我没试过,大概下面这意思吧

  1. sem_t *sem;
  2. ...
  3. sem = (sem_t *)mmap(NULL, sizeof(sem_t), ...)

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文