进程控制 ─── linux第15课

进程控制 ─── linux第15课_第1张图片

目录

进程控制

1.进程创建

(fork前面讲过了)

写时拷贝

进程终止

进程退出场景

退出码

进程终止方法


进程控制

1.进程创建

(fork前面讲过了)

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程

#include pid_t fork(void); 
返回值:自进程中返回0,父进程返回子进程id,出错返回-1

进程调用fork,当控制转移到内核中的fork代码后,内核做:

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容(pcb 虚拟进程空间 页表 )拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度

写时拷贝

        写时拷贝:申请内存,发生拷贝,进行数据修改,修改页表的物理内存,恢复权限.

并没有对原数据区进行覆盖

        通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。具体见下图:

父进程创建子进程时 ,子进程继承的页表中权限全是只读的 ,  如果子进程尝试修改,会触发系统错误(因为权限都是只读) 触发缺页中断(进行系统检测) 

        1.子进程如果修改代码段(代码段不能修改),会导致子进程被杀掉

        2. 子进程如果修改数据区, 则发生写时拷贝,也恢复了页表中的读写权限.

进程控制 ─── linux第15课_第2张图片

进程终止

进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

main函数的返回值(退出码)--->返回给父进程或者系统

echo $?  查看最近一个进程的退出码

退出码

        0:成功

        非零:错误   不同的数字代表不同的错误类型

进程终止方法

  1. main函数return      而其他函数return仅仅只是函数的调用结束,与main函数不同
  2. exit( )                    在代码的任意地方表示进程结束(会将缓冲区的内容刷新出来)推荐用
  3. _exit( )                  不会将缓冲区的内容刷新      

exit( )是上层,_exit( )是下层 

exit()=_exit() +fllush( )

return退出     return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。

示例

#include 
void exit(int status);
int main()
{
     printf("hello");
     exit(0);
}

运行结果:
[root@localhost linux]# ./a.out
hello[root@localhost linux]#
 
int main()
{
     printf("hello");
     _exit(0);
}

运行结果:
[root@localhost linux]# ./a.out
[root@localhost linux]#

进程控制 ─── linux第15课_第3张图片进程控制 ─── linux第15课_第4张图片

你可能感兴趣的:(Linux网络,服务器,linux,运维)