学习目标:
Linux 用户登录时会获取一个 Shell,产生一个进程;在 Shell 中输入一条命令,Shell 就
会创建一个进程,该进程是 Shell 的子进程。进程由进程启动,所有进程都应该有父进程。
Linux 系统中的进程结构类似树形结构,使用 pstree 命令可以查看当前系统中的进程树。
进程树的顶端是进程 init,它是系统启动后创建的第一个进程,负责启动 getty 进程,设置进
程运行级别和回收孤儿进程等工作,是所有进程的祖先。
Linux 系统中对进程的控制主要包含:进程创建、进程任务转变、进程同步和退出进!
程。Linux 提供了一些与进程控制相关的接口,常用的接口为 fork(),exec 函数族、wait()、
exit()。
下面是我第一节课学习的内容,创建单进程,创建多个进程。
学习内容:
进程创建
多道程序环境中需要创建进程的情况通常有 4 种:用户登录、作业调度、用户请求和应
用请求。当一个程序执行时,它可能需要申请一些资源,如打开某个文件、请求某项服务等。
根据之前讲解的知识,遇到这种情况,进程会进入睡眠态并放弃占用的 CPU。
若要申请的资源与之后的操作并不冲突,为了保障当前进程的持续执行(走完当前的时间片),此时可以在内存中再创建一个进程,让新的进程代替原进程执行资源申请的工作。
例如:
1.单个进程创建
#include<unistd.h>//fork()函数的函数库
pid_t fork(void)
说明:一般情况下,C风格的函数只能有一个返回值,但 fork()函数非常特殊,“它”能返回两个值。当然,并不是因为 fork()函数的构造特殊,而是因为 fork()函数调用后,若子进程创建成功,那么原程序会被复制,也就有了两个 fork()函数。
子进程创建成功后,父进程中的fork()函数会返回子进程的 pid,子进程中的 fork()函数返回 0;若子进程创建失败,原程序不会被复制,父进程的 fork()函数返回-1。下面通过一个案例来展示 fork()函数的使用方法。
案例 6-1:使用 fork()函数创建一个进程,进程创建成功后使父进程与子进程分别执行
不同的功能。
//2022.5.6 郭裕平
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid;
pid = fork();
if(pid == -1){ //创建失败
perror("fork error");
exit(1);
}
else if(pid > 0){//父进程
printf("parent process,pid=%d,ppid=%d\n",getpid(),getppid());
}
else if(pid == 0){//子进程
printf("child process,pid=%d,ppid=%d\n",getpid(),getppid());
}//of if
printf(">>>>>>>>>>>finish<<<<<<<<<<<<<<\n\n");
return 0;
}
2.多个进程的创建
计算机能实现的功能是很复杂的,可能在一个进程执行的过程中需要创建多个线程,这很容易便会想到使用循环:将 fork()函数放在循环结构中循环 5 次,就能创建 5 个进程。
循环创建:
int i;
for(i = 0; i < 2; i ++){
tempPid = fork();
}//of for i
案例代码:
//2022.5.6 郭裕平
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t tempPid;
int i;
for(i = 0; i < 2; i ++){//循环创建多个进程
if((tempPid = fork()) == 0){
break;
}//of if
}//of for i
if(tempPid == -1){
perror("fork error");
}
else if(tempPid > 0){//父进程
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
}
else{//子进程
printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
}//of if
printf("......finish......");
return 0;
}//of main
学习时间:
2022年5月7日
心得体会:
进程创建是 Linux 编程学习中重要的一项,理解进程创建的过程才能避免在以后的学
习工作中创建进程时可能发生的一些错误。我们应理解进程的创建过程,并熟练运用
fork()函数,根据程序需求创建进程,然后不断练习,熟能生巧。