题目
创建一个多进程的程序,由用户输入进程个数和每个进程的运行圈数。
代码
/************************************************************************* > File Name: main.c > Author: 杨永利 > Mail: 1795018360@qq.com > Created Time: 2021年07月14日 星期三 21时22分03秒 ************************************************************************/ #include <unistd.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { int iProcessNum = 0; int iProcessLoop = 0; pid_t pid; int i = 0, j = 0; printf("请输入线程个数:\n"); scanf("%d", &iProcessNum); printf("请输入每个线程运行圈数:\n"); scanf("%d", &iProcessLoop); // 循环创建多个进程 for (i = 0; i < iProcessNum; i++) { pid = fork(); if (pid > 0) { break; } else if (pid == 0) { for (j = 0; j < iProcessLoop; j++) { printf("第 %d 个进程运行 %d 圈!!!\n", i + 1, j + 1); } } else { perror("fork error"); exit(1); } } wait(NULL); return 0; }
知识回顾
进程
《计算机操作系统》这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。
程序是指令、数据及其组织形式的描述,进程是程序的实体。
Fork
Fork 返回值:
正确理解一次 fork(),两次返回。
- 当 fork()的返回值大于 0 时,是父进程,返回值为子进程的进程 ID;
- 当 fork()返回值等于 0 时,是子进程;
- 当 fork()的返回值小于 0 时,fork()出错,使用 perror()函数,输出出错原因。
Fork 所做工作:
fork 函数复制当前进程,在内核进程表中创建一个新的进程表项。
新的进程表项有很多属性和原进程相同:比如堆指针,栈指针,和标志寄存器的
值。新的进程表项属性与原进程不同:该进程的 PPID 被设置成原进程的 PID,
信号位图被清除(原进程设置的信号处理函数对现进程无效)
创建子进程后,父进程中打开的文件描述符默认在子进程中也是打开的,且文件
描述符的引用计数加 1。
进程状态切换
进程基本的状态有 5 种。分别为初始态,就绪态,运行态,挂起态与终止态。
其中初始态为进程准备阶段,常与就绪态结合来看。