【问题标题】:Processes and semaphores进程和信号量
【发布时间】:2023-03-27 08:40:01
【问题描述】:

所以我正在尝试如何使用 fork 和信号量来完成家庭作业,似乎每次我运行程序时,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]);
 }
    }

}

程序名称 1 2

打印:父级 孩子 家长 孩子

【问题讨论】:

  • 记住标准输出通常是行缓冲的。如果您的消息未按预期显示,请添加一些“\n”,如 printf("child\n"),或使用 fflush,如 fflush(stdout)。
  • 消息出来了,但是打印的总是父级。孩子或实验是成功的!从来都不是。这让我想知道它有什么问题:/
  • 所以在添加新行并使用 nameofprogram 1 2 运行它之后,我再次得到 Parent Child Parent Child 子进程应该重新启动后的消息没有出现......我怀疑 Parent 得到首先打印,因为父进程更快,但不确定。

标签: c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      相关资源
      最近更新 更多