我有一个班级的任务,我必须做3个子进程,每个进程都有自己的工作。父母要在创建下一个孩子之前等待每个孩子完成,然后父母要等待所有孩子完成才能打印自己的PID。我想知道的是,如果没有嵌套的if语句,这种多子进程是否可行。如果我需要超过3个子进程,如果我可以控制一个巨大的嵌套if语句之外的父进程。当我尝试将它们分成单独的if语句时,命令全部搞砸了。
基本上不是
"100000000,00"
我想要
if
child1
else
if
child2
else
if
child3
以下是我的作业的原始代码:
if
child1
if
child2
if
child3
parent code here instead of nested
答案 0 :(得分:2)
由于每个孩子都在做自己的一系列任务,你可以exit()
和每个子块结束。
所以它看起来像这样:
pid = fork();
if (pid == -1) {
perror("fork for child 1 failed");
exit(1);
if (pid == 0) {
// child 1 tasks
exit(0);
}
waitpid(pid, &returnstatus, 0);
pid = fork();
if (pid == -1) {
perror("fork for child 2 failed");
exit(1);
} else if (pid == 0) {
// child 2 tasks
exit(0);
}
waitpid(pid, &returnstatus1, 0);
pid = fork();
if (pid == -1) {
perror("fork for child 3 failed");
exit(1);
} else if (pid == 0) {
// child 3 tasks
exit(0);
}
waitpid(pid, &returnstatus2, 0);
printf("Parent PID = %d\n", getpid());
另请注意对fork
的调用的错误检查。
编辑:
如果你想要有点花哨并删除一些冗余代码,你可以使用一些函数指针:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
typedef void (*child_func_type)(char *argv[]);
void child1_tasks(char *argv[])
{
printf("Child 1 PID = %d\n", getpid());
int a, b, c;
a = atoi(argv[1]);
b = atoi(argv[2]);
c = atoi(argv[3]);
printf("Sum of integers = %d\n", a+b+c);
}
void child2_tasks(char *argv[])
{
printf("Child 2 PID = %d\n", getpid());
int a, b, c;
a = atoi(argv[1]);
b = atoi(argv[2]);
c = atoi(argv[3]);
printf("Product of integers = %d\n", a*b*c);
}
void child3_tasks(char *argv[])
{
printf("Child 3 PID = %d\n", getpid());
int a, b, c;
a = atoi(argv[1]);
b = atoi(argv[2]);
c = atoi(argv[3]);
printf("Sum of squares of integers = %d\n", (a*a)+(b*b)+(c*c));
}
int run_child(char *argv[], child_func_type child_func)
{
int returnstatus;
pid_t pid;
pid = fork();
if (pid == -1) {
perror("fork failed");
exit(1);
} else if (pid == 0) {
child_func(argv);
exit(0);
}
waitpid(pid, &returnstatus, 0);
return returnstatus;
}
int main(int argc, char **argv) {
if (argc != 4) {
printf("Error: Need 3 integer arguments\n");
exit(1);
}
int returnstatus, returnstatus1, returnstatus2;
returnstatus = run_child(argv, child1_tasks);
returnstatus1 = run_child(argv, child2_tasks);
returnstatus2 = run_child(argv, child3_tasks);
printf("Children returned %d, %d, and %d\n",
returnstatus, returnstatus1, returnstatus2);
printf("Parent PID = %d\n", getpid());
return 0;
}