首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程和信号量

进程和信号量
EN

Stack Overflow用户
提问于 2014-11-28 00:49:39
回答 2查看 348关注 0票数 0

所以我正在试验如何使用fork和信号量作为家庭作业,似乎每次我运行程序fork都会返回一个>0的数字,而我想要的是首先创建几个进程,然后使用信号量停止,然后让其中一些进程重新启动。

代码语言:javascript
复制
#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]);
 }
    }

}

程序%1%2的名称

打印:父子父子

EN

回答 2

Stack Overflow用户

发布于 2014-11-28 02:10:03

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

票数 2
EN

Stack Overflow用户

发布于 2014-11-28 17:46:57

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

要解决此问题,您有不同的可能性:

  • 创建一个所有进程都可以读取的共享内存,并按照前面的建议在这个共享内存中创建这个信号量。
  • named semaphoressem_open结合使用。这种信号量可以在不同的进程之间共享,因为它的工作方式类似于文件句柄。如果您只需要一个共享信号量(例如here),这似乎是一种更简单的方法。您必须为数组中的每个信号量生成一个唯一的名称(可能只有一个信号量,在该信号量上多次调用sem_post就足够了)。
  • 保留您的信号量,并使用线程而不是进程(但我猜您的家庭作业是关于进程的,因此这可能不适合您)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27175576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档