【Linux】Linux 操作系统 - 15 , 进程控制 ! ------- 「一文搞懂」进程创建与退出的全部细节!


前言

本主题将深入探讨进程控制的核心内容,主要包括以下四个方面:进程创建进程终止进程等待以及进程的程序替换本文将深入探讨创建与终止的具体操作流程。

一、进程创建


  在之前笔者也介绍过进程创建 fork 的详细内容 , 这里笔者就浅显带过 , 想要深入理解的请查看本篇 fork 系统调用 .

  在操作系统中存在两个进程 , 父进程和子进程 , 子进程都是由父进程所创建 , 那创建子进程怎么创建呢 ?

在这里插入图片描述


关于 fork

在这里插入图片描述


写时拷贝原理


  之前笔者谈论过写时拷贝 , 当数据共享时 , 一方进行修改, 就会进行写时拷贝 , 修改数据的备份 , 而不是修改原数据 ! 那底层是怎么做的 ???

在修改数据之前 ,二者共享数据 !

在这里插入图片描述

当一方修改数据 , 触发写时拷贝 !

在这里插入图片描述


二、进程终止


  我们运行的所有程序等 , 在操作系统中都是进程 , 对于终止 , 会有什么情况呢 ???

在这里插入图片描述

这个是我们写的所有程序的终止情况分类 , 无非就是这三类 !

什么是退出码 ?


  我们通常写程序时 , 都会有返回值这样的概念 , 那返回值到底代表什么呢 ???
  这里以 main 函数为例 :

#include <stdio.h>

// 我们经常这样写 , 为什么 main 函数的返回值是 0 呢 ??? 不能其它吗 ?????
int main()
{
	return 0;
}

  所以 , 这里就给出结论了 , 函数的返回值是有意义的 !!!

在这里插入图片描述


● 查看系统中默认退出码信息 :

#include <stdio.h>
#include <string.h>
// 打印所以退出码默认信息 
int main()
{
	// 这里不知道多少个退出码 ,随便写的 200 , 最终会发现就 134 个
	for(int i = 0; i < 200; ++i)
	{
		// strerror 是查看退出码 num 的信息的 !
		printf("%d -> %s\n",i , strerror(i));
	}

	return 0;
}

在这里插入图片描述

● 那这个退出码能被获得 , 信息存在哪 ???

   答 : 在PCB中 , 即 : task_struct 中 , 因为 task_struct 存的是所有属性信息 , 退出码的信息会存在这里方面父进程获得 !


查看退出码

在这里插入图片描述


程序退出的方式


  当我们写一个程序 , 想要这个程序退出 , 我们会怎么做 ???

在这里插入图片描述

1 . return

在这里插入图片描述

#include <stdio.h>

//func函数
int func(int num)
{	
	num += 10;
	return num;
}


//// 演示 return 
int main()
{	
	printf("我是 main 函数的主体\n");
	printf("我准备调用 func 函数啦 !!!\n");
	int ret = func(10);
	printf("func 函数调用完成 , 结果 : %d\n", ret);
	
	return 0;
}

在这里插入图片描述


2 . exit

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//func函数
int func(int num)
{	
	num += 10;
	return num;
}


int main()
{	
	printf("我将用 exit\n");
	// 这里直接用一下 exit 
	exit(3);	
	
	printf("我是 main 函数的主体\n");
	printf("我准备调用 func 函数啦 !!!\n");
	// return 后只是返回到 main 函数里
	int ret = func(10);
	printf("func 函数调用完成 , 结果 : %d\n", ret);
	
	return 0;
}

在这里插入图片描述


3 . _exit

在这里插入图片描述

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

//func函数
int func(int num)
{	
	num += 10;
	return num;
}


int main()
{	
	printf("我将用 _exit\n");
	// 这里直接用一下 _exit 
	_exit(3);	
	
	printf("我是 main 函数的主体\n");
	printf("我准备调用 func 函数啦 !!!\n");
	// return 后只是返回到 main 函数里
	int ret = func(10);
	printf("func 函数调用完成 , 结果 : %d\n", ret);
	
	return 0;
}

在这里插入图片描述

  所以 , 我们看上去 exit 和 _exit 效果是一致的 , 但是二者有什么本质区别 ???


三种退出方式区别(重点)

1 . exit 和 _exit 区别

在这里插入图片描述

在这里插入图片描述

  有一下程序 , 分别运行不同接口 , 会出现什么现象 ???

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

// 带有 \n 的 exit 
void have_n_exit()
{
	printf("Hello Linux !\n");
	sleep(2);

	exit(3);
}


// 不带 \n 的 exit 
void no_n_exit()
{

	printf("Hello Linux !");
	sleep(2);

	exit(3);
}

//带 \n 的 _exit 
void have_n__exit()
{
	printf("Hello Linux !\n");
	sleep(2);

	_exit(3);
}

//不带 \n 的 _exit 
void no_n__exit()
{
	printf("Hello Linux !");
	sleep(2);

	_exit(3);
}

int main()
{	
	//////// 一个一个运行 , 因为 exit 后后面的不会执行 !!!!!!!!!!!!!!!

	// 带有 \n 的 exit 
//	have_n_exit();
	// 不带 \n 的 exit 
//	no_n_exit();	
	// 带有 \n 的 _exit 
//	have_n__exit();
	// 不带 \n 的 _exit 
	no_n__exit();

	return 0;
}

  通过运行 , 会有以下现象 :
在这里插入图片描述

  详细解释 :

在这里插入图片描述

总结

在这里插入图片描述


2 . exit 系列 和 return 的区别

在这里插入图片描述


错误码和错误信息

在这里插入图片描述


总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值