【问题标题】:Unexpected Output Running Semaphore [duplicate]运行信号量的意外输出[重复]
【发布时间】:2013-05-14 17:55:29
【问题描述】:

除非第二个进程完成了第 (i-1) 次迭代,否则第一个进程不应开始其第 (i) 次迭代。输出不是我需要的。我想知道是否可以通过只有两个信号量? 这是我的代码。

#include <stdio.h>   
#include <sys/types.h>
#include <unistd.h>  
#include <stdlib.h>  
#include <errno.h>  
#include <semaphore.h>

sem_t semA, semB,sem,m;

int main(void)
{
 int i;

   pid_t child_a, child_b,pid2,pid3;
    sem_init(&semA, 0, 1);
    sem_init(&semB, 0, 0);
sem_init(&m, 0, 0);

   child_a = fork();
//wait();

   if (child_a == 0) {


  //  int j;

      pid2 =getpid();
      for (i = 0; i < 5; )
      {
    sem_wait(&semA);
//sem_wait(&m);
         printf("child1: %d\n", i);
     i++;
     //printf("pid1: %d\n", pid2);
         //printf("--------------------------\n");
         sleep(3);
//sem_post(&m);

sem_post(&semB);
      }
}    
   else {

   child_b = fork();
//wait();
    if (child_b == 0) {

      pid3 =getpid();
      for (i = 0; i < 5;)
      {
sem_wait(&semB);
//sem_wait(&m);
         printf("child2: %d\n", i);
 i++;
         //printf("pid2: %d\n", pid3);
         //printf("--------------------------\n");
         sleep(5);
//sem_post(&m);
sem_post(&semA);

      }

    } 
    }

    exit(0);
   return 0;
}

我期望的输出是:

child1: 0
child2: 0
child1: 1
child2: 1
child1: 2
child2: 2
child1: 3
child2: 3
child1: 4
child2: 4
child1: 5
child2: 5
child1: 6
child2: 6
child1: 7
child2: 7
child1: 8
child2: 8
child1: 9
child2: 9

但我只有一个孩子:

child1: 0

(我正在运行 UBUNTU 12.10)

【问题讨论】:

  • 您的代码演示是灾难性的。然后,始终阅读您正在使用的系统调用的手册页,了解不同的错误条件,然后检查返回值并捕获这些错误条件。总是。

标签: c ubuntu semaphore


【解决方案1】:

为了在多个进程中使用信号量,您必须使用命名信号量或将信号量放在共享内存中。

参见 linux 手册页 sem_overview(7)

对于您正在做的事情,命名信号量比共享内存更容易使用。以下应该有效:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/stat.h>

sem_t * semA;
sem_t * semB;
int main(void)
{
  int i;

  pid_t child_a, child_b,pid2,pid3;
  semA = sem_open("/mysema", O_CREAT, S_IRUSR | S_IWUSR, 1);
  semB = sem_open("/mysemb", O_CREAT, S_IRUSR | S_IWUSR, 0);

  child_a = fork();

  if (child_a == 0) {

      pid2 =getpid();
      for (i = 0; i < 5; )
      {
        sem_wait(semA);
        printf("child1: %d\n", i);
        i++;
        sem_post(semB);
        sleep(3);
      }
  }
  else {
    child_b = fork();
    if (child_b == 0) {

      pid3 =getpid();
      for (i = 0; i < 5;)
      {
        sem_wait(semB);
        printf("child2: %d\n", i);
        i++;
        sleep(5);
        sem_post(semA);

      }

    }
  }

  exit(0);
  return 0;
}

【讨论】:

  • 如何在共享内存中放置信号量?
  • 如 cebarth 所说,阅读 sem_overview(7) 和它指向的其他手册页。
  • 这是我第一次使用信号量。我阅读了 sem_overview(7) 但我找不到任何示例。link这就是我再次询问的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2013-02-02
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
相关资源
最近更新 更多