fork() 执行不同的进程
Fork() to performe different processes
我正在尝试使用多个 fork() 调用来创建多个具有不同任务的 children
我找到了一个代码
Multiple child process
与我想要的非常接近,但我无法完全理解它
pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild != 0)
{
// In parent
secondChild = fork();
if(secondChild != 0)
{
// In parent
}
else
{
// In secondChild
}
}
else
{
// In firstChild
}
我的问题是:
- 创建了多少个进程(我假设我们有 4 个,因为它是 2 个叉子!)?
- 在这部分代码中
firstChild = fork();
if(firstChild != 0)
{
// In parent
secondChild = fork();
if(secondChild != 0)
{
// In parent
}
“//in parent”是否表示它们是相同的进程(当我尝试测试时它们具有相同的 PID)。
- 如何使用 2 个叉子创建 3 个 children?(我可以画出以 4 个叶子结尾的树,其中 3 个是 children 和 1 个 parent)
谢谢(如果我没有完全理解 Fork 的概念,请随时告诉我)
How many process have been created (I assume that we have 4 since it's 2 forks!)?
根据您的 forks
结果,它应该是 0 到 2。如果没有出错,可能是 2。有一个父进程分叉 2 个子进程。
Does "//in parent" mean both of them are the same process (they have the same PID when I tried to test it).
是的。在您的情况下,代码正在检查 fork
的 return 值是否为非零。这不是一个好主意,因为它涵盖了 2 个不同的案例:
- 它可能小于零表示错误,或者...
- 它可能大于零,向父级指示新生成的进程的
pid
无论如何......考虑到一切顺利并且两个叉子都成功了,你最终会得到一个有 2 个不同子进程的父进程。
How can I create 3 children using 2 forks?( I can draw the tree that ends with 4 leaves 3 of them are children and 1 parent
像这样应该可以解决问题:
firstChild = fork();
if (firstChild < 0) {
exit(EXIT_FAILURE);
perror("fork");
}
secondChild = fork();
请注意,通过不再检查 fork()
的 return 值,我让子进程继续在与父进程相同的位置执行。所以下一个 fork 实际上将由父进程和子进程执行,每个子进程都产生一个新进程。所以我会得到这样的东西...
parent─┬─child1───(child1's child)
└─child2
不过我想不出有什么办法只用 2 个叉子就可以得到这个:
parent─┬─child1
├─child3
└─child2
注意:在 Whosebug 上,每个主题只限制自己回答一个问题。
下面的代码展示了如何创建 4 个进程 (1 parent 3 children) 只有 2 个 fork
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int *list;
void calculate_average(int );
void calculate_maximum(int);
void calculate_minimum(int);
void calculate_average(int count)
{
int i, total = 0;
for (i = 0; i < count; i++)
total += list[i];
double average = total / count;
printf("average is %f\n",average);
}
void calculate_maximum(int count)
{
int i;
int maximum = list[0];
for (i = 1; i < count; i++)
if (list[i] > maximum)
maximum = list[i];
printf("maximum is %d\n",maximum);
}
void calculate_minimum(int count)
{
int i;
int minimum = list[0];
for (i = 1; i < count; i++)
if (list[i] < minimum)
minimum = list[i];
printf("minimum is %d\n",minimum);
}
int main(int argc, char *argv[])
{
pid_t pid, pid1;
int num_of_args = argc-1;
int i;
/* allocate memory to hold array of integers */
list = malloc(sizeof(int)*num_of_args);
for (i = 0; i < num_of_args; i++)
list[i] = atoi(argv[i+1]);
printf("The %d number of input ingeters are\n",num_of_args);
for (i = 0; i < num_of_args; i++)
printf("%d\n",list[i]);
/* fork a child process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed\n");
return 1;
}
else if (pid == 0) { /* P2 */
pid1=getppid();
calculate_average(num_of_args);
}
else { /* P1 */
pid1=getpid();
wait(NULL);
}
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed\n");
return 1;
}
else if (pid == 0) { /* could be either P3 or P4 */
if (getppid() == pid1) { /* P3 */
calculate_minimum(num_of_args);
}
else { /* P4 */
calculate_maximum(num_of_args);
}
}
else {
wait(NULL);
}
return 0;
}
请注意,其中一个 children 将是 parent 的孙子
我正在尝试使用多个 fork() 调用来创建多个具有不同任务的 children 我找到了一个代码 Multiple child process
与我想要的非常接近,但我无法完全理解它
pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild != 0)
{
// In parent
secondChild = fork();
if(secondChild != 0)
{
// In parent
}
else
{
// In secondChild
}
}
else
{
// In firstChild
}
我的问题是:
- 创建了多少个进程(我假设我们有 4 个,因为它是 2 个叉子!)?
- 在这部分代码中
firstChild = fork();
if(firstChild != 0)
{
// In parent
secondChild = fork();
if(secondChild != 0)
{
// In parent
}
“//in parent”是否表示它们是相同的进程(当我尝试测试时它们具有相同的 PID)。
- 如何使用 2 个叉子创建 3 个 children?(我可以画出以 4 个叶子结尾的树,其中 3 个是 children 和 1 个 parent)
谢谢(如果我没有完全理解 Fork 的概念,请随时告诉我)
How many process have been created (I assume that we have 4 since it's 2 forks!)?
根据您的 forks
结果,它应该是 0 到 2。如果没有出错,可能是 2。有一个父进程分叉 2 个子进程。
Does "//in parent" mean both of them are the same process (they have the same PID when I tried to test it).
是的。在您的情况下,代码正在检查 fork
的 return 值是否为非零。这不是一个好主意,因为它涵盖了 2 个不同的案例:
- 它可能小于零表示错误,或者...
- 它可能大于零,向父级指示新生成的进程的
pid
无论如何......考虑到一切顺利并且两个叉子都成功了,你最终会得到一个有 2 个不同子进程的父进程。
How can I create 3 children using 2 forks?( I can draw the tree that ends with 4 leaves 3 of them are children and 1 parent
像这样应该可以解决问题:
firstChild = fork();
if (firstChild < 0) {
exit(EXIT_FAILURE);
perror("fork");
}
secondChild = fork();
请注意,通过不再检查 fork()
的 return 值,我让子进程继续在与父进程相同的位置执行。所以下一个 fork 实际上将由父进程和子进程执行,每个子进程都产生一个新进程。所以我会得到这样的东西...
parent─┬─child1───(child1's child)
└─child2
不过我想不出有什么办法只用 2 个叉子就可以得到这个:
parent─┬─child1
├─child3
└─child2
注意:在 Whosebug 上,每个主题只限制自己回答一个问题。
下面的代码展示了如何创建 4 个进程 (1 parent 3 children) 只有 2 个 fork
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int *list;
void calculate_average(int );
void calculate_maximum(int);
void calculate_minimum(int);
void calculate_average(int count)
{
int i, total = 0;
for (i = 0; i < count; i++)
total += list[i];
double average = total / count;
printf("average is %f\n",average);
}
void calculate_maximum(int count)
{
int i;
int maximum = list[0];
for (i = 1; i < count; i++)
if (list[i] > maximum)
maximum = list[i];
printf("maximum is %d\n",maximum);
}
void calculate_minimum(int count)
{
int i;
int minimum = list[0];
for (i = 1; i < count; i++)
if (list[i] < minimum)
minimum = list[i];
printf("minimum is %d\n",minimum);
}
int main(int argc, char *argv[])
{
pid_t pid, pid1;
int num_of_args = argc-1;
int i;
/* allocate memory to hold array of integers */
list = malloc(sizeof(int)*num_of_args);
for (i = 0; i < num_of_args; i++)
list[i] = atoi(argv[i+1]);
printf("The %d number of input ingeters are\n",num_of_args);
for (i = 0; i < num_of_args; i++)
printf("%d\n",list[i]);
/* fork a child process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed\n");
return 1;
}
else if (pid == 0) { /* P2 */
pid1=getppid();
calculate_average(num_of_args);
}
else { /* P1 */
pid1=getpid();
wait(NULL);
}
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed\n");
return 1;
}
else if (pid == 0) { /* could be either P3 or P4 */
if (getppid() == pid1) { /* P3 */
calculate_minimum(num_of_args);
}
else { /* P4 */
calculate_maximum(num_of_args);
}
}
else {
wait(NULL);
}
return 0;
}
请注意,其中一个 children 将是 parent 的孙子