本节课主要学习了在ubuntu环境下对于进程的创建相关的一些操作,编译环境:C语言
1.如果子进程执行完了将要被回收,却找不到回收他的父进程(或者说是创建它的父进程不存在了),那么就称这个进程为“孤儿进程”。
2.一个机器的进程号是很有限的,在一个进程结束运行之后是要回收进程号的,而孤儿进程的进程号无法被回收,少的话还并无大碍,可要是孤儿进程太多了的话,就会导致程序在执行时,没有足够的进程号分配,导致程序无法执行,导致电脑瘫痪,而且这种情况储存和内存都不会出现异常,这就是僵尸进程的原理和危害。
3.代码部分
fork() //函数父进程创建子进程
fork()包含在函数<unistd.h>中
调用该函数的进程称为父进程
pid_t fork()
// pid相当于int类型
1.调用fork()函数相当于将父进程复制形成一个新的进程,新的进程称为子进程
2.执行了fork(),就相当于有了两个进程,每一个进程都有一个返回值,如果父进程创建子进程成功,则返回子进程的pid,而子进程则返回0,如果创建失败的话就返回-1.
3.父进程编号 1 ,子进程编号 0.(正常情况)。
示例1(创建进程):
(1).代码
#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());
}//判断是不是子进程,获得父进程和自己的编号
else{
printf("---------finish\n")
}
return 0;
}
(2).运行结果
示例2(关于进程的分裂):
(1).与第一段代码相比大概只有如下代码的不同 :
for(i=0;i<5;i++){
if((pid=fork())==0){
break;
}
}
//此段代码,所表示的意思是禁止父进程分裂,只让子进程分裂,并且分裂五次。
(2).全部代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid;
int i;
for(i=0;i<5;i++){
if((pid=fork())==0){
break;
}
}
if(pid==-1){
perror("fork error");
exit(-1);
}
else if(pid>0){
printf("parent process:pid=%d\n",getpid());
}
else if(pid==0){
printf("children process,pid=%d,pid=%d\n",getpid(),getppid());
}
return 0;
}
(3).运行结果如下:
有一个问题(老师在课堂上讲过的):
1.为什么进程的pid排列不按照一定的顺序?
答:因为这些子进程属于同一优先级,所获得的系统资源也一样,先获得的就先输出来;
2.为什么出现了父进程和对应的pid之后会出现bash命令之后,才出现子进程及其pid
答:同样从优先级考虑,因为父进程,子进程还有bash命令优先级相同,共同竞争系统资源,谁优先获取谁就先执行。