所以我正在尝试如何使用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
打印:父 儿童 亲 子
答案 0 :(得分:2)
您需要阅读sem_init()
的手册页。您正在创建的信号量类型不会在进程间共享。这需要对程序进行非平凡的更改,因为您还需要设置共享内存。有关如何使程序正常工作的详细说明,请参阅this question。
答案 1 :(得分:2)
当程序调用fork时,会创建一个带有内存空间新精确副本的新进程。这意味着您的子进程中的sem
与父进程中的sem
不同。因此,当您调用sem_post
时,您的子进程无法通知更改并退出等待函数。
要解决这个问题,你有不同的可能性:
创建一个共享内存,可以被所有进程读取,并在此共享内存中创建此信号量,如已建议的那样。
将named semaphores与sem_open一起使用。这种信号量可以在不同的进程中共享,因为它像文件句柄一样工作。如果您只需要共享信号量(例如here),这似乎是一种更简单的方法。您必须为数组中的每个信号量生成一个唯一的名称(可能只有一个您多次调用sem_post的信号量就足以供您使用)。
保留你的信号量并使用线程代替进程(但我猜你的作业是关于进程的,所以这可能不适合你)