【发布时间】: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