linux中让子进程执行和父进程不同功能的两种常用方法

linux中让子进程执行和父进程不同功能的两种常用方法,第1张

运维

Linux系统进程控制

行者111111111111111

原创

关注

0点赞·3人阅读

1、进程创建

shell命令行启动程序指令皆是创建了进程,我们通常通过调用fork()函数创建子进程。

1.1、fork()函数用法简介

调用fork后, *** 作系统内核将:

分配新的内存块和内核数据结构给子进程

将父进程部分数据结构内容拷贝至子进程

添加子进程到系统进程列表当中

fork返回,开始调度器调度

1.2、fork函数返回值

子进程返回0,父进程返回的是子进程的pid

原因:fork之后进入内核,申请内存构建子进程PCB、虚拟内存、页表,将子进程设置R状态,放入调度队列,由于创建子进程之后父子进程共享代码,所以父子进程都会有return返回值。返回值返回给变量本质发生了写时拷贝,改变了子进程对应页表的指向,数据映射到了其他区域

1.3、写时拷贝

由于进程要独立,代码不可修改,数据可改,所以默认数据各有一份,但是内存是有限度的,如果把父进程数据全部再拷贝一份,那么太浪费内存,甚至导致fork失败。通常通过写时拷贝实现,就是当父或子进程修改数据时,将要修改的数据拷贝一份,让子进程页表指向新的重复数据在发生修改

父子进程

在linux系统里面,子进程由父进程fork而来,而所有的进程都是由init进程或其子进程fork而来,即init进程是所有进程的祖先。

父子进程的运行是相对独立的,一方的退出不会导致另一方退出。

进程组和会话

Session特点

session可以在任何时候创建,调用setsid函数即可,session中的第一个进程即为session的leader,leader是不能变的。常见的创建session的场景是用户登录,启动bash进程时将会创建新的session,bash进程会作为session的leader,随后bash里面运行的进程(不特殊处理)都将属于这个session。

session的主要特点是当session的leader退出后,session中的所有其它进程将会收到SIGHUP信号,其默认行为是终止进程,即session的leader退出后,session中的其它进程也会退出。

如果session和tty关联的话,它们之间只能一一对应,一个tty只能属于一个session,一个session只能打开一个tty。当然session也可以不和任何tty关联。

进程的启动方式:

1)前台启动:用户输入命令,直接执行程序

2)后台启动:在命令行尾加入“&”符号

要使终端关闭时进程不退出,有以下几种情况:

1)用户进程拦截SIGHUP信号。

2)使用户进程和bash进程不在一个session。

分几种情况:

父进程永不退出:这种情况下若子进程退出,而父进程没有收集子进程的退出状态,则此子进程会变为僵尸进程,一直占用少量资源,有危害;

父进程比子进程先退出:这种情况下父进程退出时,仍在运行的子进程会变为孤儿进程,孤儿进程会被托管给init进程,孤儿进程结束时由init进程负责回收;

父进程比子进程晚退出:子进程先退出时会变为僵尸进程,占用少量资源;待到父进程再退出时,子进程由僵尸进程变为孤儿进程,init进程会回收这些已僵死的孤儿进程,则这些已经僵死的孤儿进程就能瞑目而去了;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8504954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存