c - 例如 fork()、c 语言
问题描述
我正在学习fork()
并试图理解我发现的这个例子。据我所知,我们总是为每个调用使用不同的过程,无论是 forfibonacci(n-1)
和fibonacci(n-2)
; pid1
被挂起以waitpid()
将孩子的最后退出状态保存在 fib 中。发生同样的事情pid2
,最后,最后两个进程的返回值相加。说的时候公平吗?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
size_t fibonacci( size_t n )
{
pid_t pid1, pid2;
size_t fib;
int status;
switch (n)
{
case 0:
return 0;
case 1:
return 1;
case 2:
return 1;
default:
break;
}
pid1 = fork();
if (pid1 == 0)
exit( fibonacci( n - 1 )); // chiamo fibonacci(n-1) usando pid1
else if (pid1 < 0)
{
printf("ERRORE");
exit(EXIT_FAILURE);
}
pid2 = fork();
if (pid2 == 0)
exit( fibonacci( n - 2 )); // chiamo fibonacci(n-1) usando pid2
else if (pid2 < 0)
{
printf("ERRORE");
exit(EXIT_FAILURE);
}
if (waitpid( pid1, &status, 0 ) == -1) // sospende pid1
{
printf("ERRORE");
exit(EXIT_FAILURE);
}
fib = WEXITSTATUS( status ); // salvo in fib lo stato di uscita del figlio di pid1
if (waitpid( pid2, &status, 0 ) == -1) // sospendo pid2
{
printf("ERRORE");
exit(EXIT_FAILURE);
}
return fib + WEXITSTATUS( status ); // recupero valori di ritorno dei processi
}
int main(int argc, char *argv[])
{
int a = atoi(argv[1]);
if (a > 0 && a < 10)
{
printf("Calcolo fibonacci di %d \n", a);
printf("L' %so numero di Fibonacci e' %d.\n", argv[1], fibonacci(a));
}
else
{
printf("Devi inserire un numero compreso tra 1 e 10\n");
exit(EXIT_FAILURE);
}
}
解决方案
推荐阅读
- electron - 电子:dialog.showOpenDialog 不返回承诺?
- python - math.log 的错误输出
- node.js - Why I am I unable to instantiate eventEmitter obj using the code below
- django - How to get the whole queryset
- entity-framework - VBCS 编译器在实时服务器上使用 ASP .Net MVC 中的 EF 首次运行已发布网站的每个页面时占用几乎 70% 的 CPU
- docker - 使用实时监视在 VS Code 中调试 dockerize ASP.Net Core 应用程序
- android - Is it possible to redirect bluetooth from a TV to hearing aids?
- python - Python在按钮释放而不是按钮按下时播放声音
- vuetify.js - 我无法更改 Vuetify 中布尔复选框的文本颜色(版本 -> nuxtjs/vuetify:“0.5.5”)
- java - Parameter 0 of constructor in ServiceImpl required a bean of type DAO that could not be found