文章目录
- 进程相关概念
- 进程创建实战
- fork函数创建进程
- vfork创建进程
- 子进程退出
- 等待子进程
- 孤儿进程
进程相关概念
一、什么是程序,什么是进程,有什么区别?
程序是静态的概念,gcc xxx.c –o pro 磁盘中生成pro文件,叫做程序
进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程
二、如何查看系统中有哪些进程?
使用ps指令查看,实际工作中,配合grep来查找程序中是否存在某一个进程
使用top指令查看,类似windows任务管理器
三、 什么是进程标识符?
每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证
编程调用getpid函数获取自身的进程标识符,getppid获取父进程的进程标识符
四、 什么叫父进程,什么叫子进程?
进程A创建了进程B,那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系
五、C程序的存储空间是如何分配?
进程创建实战
fork函数创建进程
函数模本:pid_t fork(void);
返回值:fork函数调用成功,返回两次
返回值为0, 代表当前进程是子进程
返回值非负数,代表当前进程为父进程,返回的值代表就是创建的子进程的pid号
调用失败,返回-1
创建一个子进程的一般目的:
就好比如在一次酒席中,父进程在门口招待客人,每当一个客人进来,就产生一个子进程专门负责招待这位客人。
fork函数实际应用:
运行结果:
具体哪个进程进行有调度决定!
由此可见,可以见得fork函数创建的子进程的时候其实是复制了父进程的一份变量,自己单独使用,自己改变并不影响父进程的变量!
vfork创建进程
与fork函数区别:
1、vfork 直接使用父进程存储空间,不拷贝。
2、vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
vfork函数实际运用
exit函数:退出函数
运行结果:
由此可以印证了vfork函数与fork函数的区别一
子进程退出
1、正常退出
Main函数调用return
进程调用exit(),标准c库
进程调用_exit()或者_Exit(),属于系统调用
2、异常退出
调用abort
当进程收到某些信号时,如ctrl+C
最后一个线程对取消(cancellation)请求做出响应
摘抄:
等待子进程
一、为啥要等待子进程退出
父进程等待子进程退出并收集子进程的退出状态
子进程退出状态不被收集,变成僵死进程(僵尸进程)
二、相关函数
两者区别:
具体作用:
函数原型:
1、wait函数:
参数:
status参数:是一个整型数指针
非空:子进程退出状态放在它所指向的地址中。
空:不关心退出状态
2、waitpid函数
参数:
status参数:是一个整型数指针
非空:子进程退出状态放在它所指向的地址中。
空:不关心退出状态
小运用:
小提示:返回值非负数,代表当前进程为父进程,返回的值代表就是创建的子进程的pid号
前面有!
运行结果:
孤儿进程
父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程
Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程
init进程的pid号为1;