进程的创建和回收

进程概念

程序:存放在磁盘上的指令和数据的有序集合(静态的)
进程:执行一个程序所分配的资源的总称;进程是一次执行过程(动态的,包括创建、调度、执行和消亡)

程序和进程在内容上的区别
程序包含的内容:代码段、数据段、BSS段
进程包含的内容:
BSS段:存放程序中未初始化的全局变量
数据段:已初始化的全局变量
代码段:程序执行代码
堆(heap):malloc等函数分配内存
栈(stack):局部变量,函数参数,函数的返回值
进程控制块(pcb):PID, 进程优先级,文件描述符表

进程类型
交互进程、批处理进程、守护进程。

进程状态
运行态、等待态、停止态、死亡态

查看进程信息
ps 查看系统进程快照
top 查看进程动态信息
/proc 查看进程详细信息

ps 命令详细参数:
-e:显示所有进程
-l:长格式显示更加详细的信息
-f 全部列出,通常和其他选项联用

top 查看进程动态信息
shift +> 后翻页
shift +< 前翻页
top -p PID 查看某个进程
ps -elf|grep CMD 查看某个进程

改变进程优先级
nice 按用户指定的优先级运行进程
nice [-n NI值] 命令
NI 范围是 -20~19。数值越大优先级越低
普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

renice 改变正在运行进程的优先级
renice [优先级] PID

jobs 查看后台进程
bg 将挂起的进程在后台运行
fg 把后台运行的进程放到前台运行

ctrl+z 把运行的前台进程转为后台并停止。
./test & 把test程序后台运行

进程的创建
#include <unistd.h>
pid_t fork(void);

失败时返回-1
成功时父进程返回子进程的进程号,子进程返回0
通过fork的返回值区分父进程和子进程

注意:
1.子进程只执行fork之后的代码
2. 父子进程执行顺序是操作系统决定的。

子进程继承了父进程的内容
父子进程有独立的地址空间,互不影响

若父进程先结束
子进程成为孤儿进程,被init进程收养
子进程变成后台进程

若子进程先结束
父进程如果没有及时回收,子进程变成僵尸进程

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv){
	pid_t pid;
	int i;
	for(i = 0; i < 5; i++){
		pid = fork();
		if(pid>0){
			printf("Father process\n");
		}else if(pid == 0){
			printf("Child process\n");
			break;
		}else if(pid < 0){
			perror("fork");
			return 0;
		}
	}
}

进程的退出
#include <stdlib.h>
#include <unistd.h>
void exit(int status);
void _exit(int status);

结束当前的进程并将status返回
exit结束进程时会刷新(流)缓冲区

return 和exit的区别
main函数结束时会隐式地调用exit函数,普通函数return是返回上一级。

进程的回收
#include <unistd.h>
pid_t wait(int *status);
成功时返回回收的子进程的进程号;失败时返回EOF
若子进程没有结束,父进程一直阻塞
若有多个子进程,哪个先结束就先回收
status 指定保存子进程返回值和结束方式的地址
status为NULL表示直接释放子进程PCB,不接收返回值

#include <unistd.h>
pid_t waitpid(pid_t pid, int *status, int option);
参数:
pid
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

options
options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用
WNOHANG :若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0
WUNTRACED: 返回终止子进程信息和因信号停止的子进程信息

wait(wait_stat) 等价于waitpid(-1,wait_stat,0)

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在中,如果一个子进程先于父进程退出,而父进程没有对子进程的退出结果进行读取,那么该子进程会成为孤儿进程。孤儿进程会被1号init进程领养,并且进入僵尸状态,由1号init进程负责处理和回收。 为什么要回收孤儿进程呢?因为对于任何一个进程来说,当它被执行起来时,系统会为其分配一块虚拟地址空间。但是当进程退出时,它只能释放自己用户区的资源。如果不及时回收孤儿进程,就会造成内存泄漏,导致系统的虚拟地址空间资源耗尽。因此,为了保证系统资源的正常使用,孤儿进程回收是必要的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Linux操作系统】孤儿进程](https://blog.csdn.net/weixin_63449996/article/details/130533945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux:虚拟地址空间,程序和进程创建回收进程,孤儿进程和僵尸进程。为什么要回收进程?](https://blog.csdn.net/qq_51004011/article/details/126407281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值