在 C for Linux 中使用 fork() 进行阶乘计算
使用 fork() 系统调用编写一个 Unix C 程序,该程序生成阶乘并在子进程中给出一系列序列,如 1、2、6、24、120……。
序列号在命令行中提供。
例子:
Input :gfg@ubuntu:~/$ gcc -o fork fork.c
gfg@ubuntu:~/$ ./fork 6
Output :1
1 2
1 2 6
1 2 6 24
1 2 6 24 120
1 2 6 24 120 720
After deletion sum
1 3 9 33 153 873 Done
Input :gfg@ubuntu:~/$ gcc -o fork fork.c
gfg@ubuntu:~/$ ./fork -2
Output :negative number entered -2
使用 fork() 创建子进程。 fork() 返回:
- < 0未能创建子(新)进程
- = 0表示子进程
- > 0即子进程对父进程的进程ID。当 >0 父进程将执行。
子进程内部:如果输入为 6,则阶乘序列的前六个数字将作为子进程的输出。因为父进程和子进程都有自己的数据副本,所以子进程必须输出序列。
父进程内部:父进程调用wait()调用等待子进程完成后退出程序。执行必要的错误检查以确保在命令行上不传递非负数。
// C program to illustrate factorial calculation
// using fork() in C for Linux
#include
#include
#include
#include
#include
#include
int main(int argc , char *argv[] )
{
pid_t pid;
if (argc != 2)
{
printf("arg missing or exceeding\n");
exit(0);
}
// atoi converts string to integer
if ( atoi ( argv[1] ) <0 )
{
printf("negative number entered %d", atoi(argv[1]));
exit(0);
}
pid=fork();
if ( pid<0 )
{
printf("failed to create child\n");
exit(0);
}
else if ( pid==0 )
{
//Child Process
int ans = 0, i, j, k = 2, n;
// atoi converts string to integer
n = atoi(argv[1]);
int arr[n],sum[n];
arr[0] = 1;
// generating factorial series
for (i=1 ; i 0)
printf(" %d ", sum[i]);
}
exit(0);
}
// parent process
else
{
wait(NULL);
// waiting for child process to end
printf("Done\n");
}
}
以名称 fork.c 保存的编译代码代码
gfg@ubuntu:~/$ gcc -o fork fork.c
输入:
gfg@ubuntu:~/$ ./fork 5
输出:
1
1 2
1 2 6
1 2 6 24
1 2 6 24 120
After deletion sum
1 3 9 33 153 Done
首先,接受命令行参数。然后传递参数的数量并检查参数是否为正。
之后,生成阶乘序列。
相关文章- 演示 fork() 和 pipe() 的 C 程序
参考:
- http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html
- http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/wait.html