所以我正在试验如何使用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的名称
打印:父子父子
发布于 2014-11-28 02:10:03
您需要阅读sem_init()的手册页。您现在正在创建的信号量类型不是跨进程共享的。这需要对您的程序进行大量更改,因为您还需要设置共享内存。有关如何使您的程序工作的详细说明,请参阅this question。
发布于 2014-11-28 17:46:57
当程序调用fork时,将使用内存空间的新副本创建一个新进程。这意味着子进程中的sem与父进程中的sem不同。因此,当您调用sem_post时,您的子进程无法收到更改通知并退出等待函数。
要解决此问题,您有不同的可能性:
https://stackoverflow.com/questions/27175576
复制相似问题