进程和信号量

时间:2014-11-27 16:49:39

标签: c

所以我正在尝试如何使用fork和semaphores进行作业,似乎每次运行程序fork总是返回一个数字> 0,而我想要的是首先要做几个进程然后停止使用信号量,然后让它们中的一些重新启动。

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>

int     main(int argc,char *argv[])
{
int i,count;
 count = 0;
 pid_t  *Pc;
 Pc=(pid_t *) malloc((argc-2)*sizeof(pid_t));
 sem_t *sem;
  sem = (sem_t *) malloc((argc-2)*sizeof(sem_t));
     for (i = 0; i <= argc-2; i++){
      sem_init(&sem[i], 0, 0);
 }
     for (i =0; i<=argc-2; i++){
                    Pc[i] = fork();
                    if (Pc[i] == 0){
                   printf(" child");
                    sem_wait(&sem[i]);
                    printf("Experiment was a success!");
          }
           if (Pc[i]>0){
             printf("Parent");
}
    }
        for (i =0; i<=argc-2; i++){
           if (Pc[i] > 0)
            count++;
        }

    for (i= 0; i<=3; i++){
            if  ( count ==  argc-2){
            sem_post(&sem[i]);
 }
    }

}

nameofprogram 1 2

打印:父         儿童         亲         子

2 个答案:

答案 0 :(得分:2)

您需要阅读sem_init()的手册页。您正在创建的信号量类型不会在进程间共享。这需要对程序进行非平凡的更改,因为您还需要设置共享内存。有关如何使程序正常工作的详细说明,请参阅this question

答案 1 :(得分:2)

当程序调用fork时,会创建一个带有内存空间新精确副本的新进程。这意味着您的子进程中的sem与父进程中的sem不同。因此,当您调用sem_post时,您的子进程无法通知更改并退出等待函数。

要解决这个问题,你有不同的可能性:

  • 创建一个共享内存,可以被所有进程读取,并在此共享内存中创建此信号量,如已建议的那样。

  • named semaphoressem_open一起使用。这种信号量可以在不同的进程中共享,因为它像文件句柄一样工作。如果您只需要共享信号量(例如here),这似乎是一种更简单的方法。您必须为数组中的每个信号量生成一个唯一的名称(可能只有一个您多次调用sem_post的信号量就足以供您使用)。

  • 保留你的信号量并使用线程代替进程(但我猜你的作业是关于进程的,所以这可能不适合你)