前言
本次内容是关于Linux进程管理,是上课内容的复习,可能会有错。
一、进程概述
1:进程是一个二进制程序的执行过程。、
2:部分标识符
pid(进程标识符) /ppid(父进程标识符)
函数接口:
pid/ppid pid_t getpid(void)/ pid_t getppid(void)
二、进程控制
1.函数
fork()
2. 创建一个进程
Linux使用fork()函数创建进程,它是包含在函数库unistd.h中,
调用fork()函数创建的进程称为子进程,调用fork()函数的进程为父进程。
pid_t fork(void)
2.1案例
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
int main(){
pid_t tempPid;
tempPid=fork(); //调用fork()函数创建子进程
if(tempPid==-1){ //创建失败
perror("fork error");
exit(1); //退出进程,返回值为1
}//of if
else if (tempPid>0){ //父进程
printf("parent process,pid=%d,ppid=%d\n",getpid(),getppid());
}//of else
else if(tempPid==0){ //创建成功----子进程
printf("child process,pid=%d,ppid=%d\n",getpid(),getppid());
}//of else
printf("---------finish----------\n");
return 0;
}//of main
2.2 代码运行
这里出现了一个问题,就是我们子进程的ppid不等于父进程的pid,而=1,这是为什么呢?
原因是因为父进程在子进程之前结束了。因为父进程和子进程的优先级是相同的,CPU会随机选择,随机导致了父进程先于子进程结束了,形成了孤儿进程,如果不回收孤儿进程,它就会一直占用进程号,孤儿进程累积导致没有进程号分配,程序将无法执行,所以引入了优先级更高的init(pid=1),如果没有父进程,则子进程会指向init。孤儿进程解决办法在下面多个进程那里给出。
3.创建多个进程
3.1对案例2.1进行一点修改,加入循环
int i;
for(i = 0; i < 2; i ++){
tempPid = fork();
}//of for i
3.2案例代码
#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 //调用fork()函数创建子进程
if(tempPid==-1){ //创建失败
perror("fork error");
exit(1); //退出进程,返回值为1
}//of if
else if (tempPid>0){ //父进程
printf("parent process,pid=%d,ppid=%d\n",getpid(),getppid());
}//of else
else { //创建成功----子进程
printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
}//of else
printf("---------finish----------\n");
return 0;
}//of main
3.3 代码运行
这是当i<5的情况
孤儿进程解决
这里也出现了父进程先结束,导致子进程的ppid是1,如何解决呢?
可以使用sleep()。因为我们这里是五次循环,所以我们在父进程那里加入一行sleep(5),让它最后执行。
sleep(5)
修改后 代码运行
这里又出现了一个问题:子进程的编号不是递增的
这同样也是因为子进程的优先级都是一样的,所以CPU的选择是随机的。
总结
代码运行出的问题都在对应运行下总结了,不在赘述,本次课程我对进程的了解加深,比如孤儿进程,进程优先级等等,本章只是简单的对fork()函数进行简单的复习。