文章目录
前言
本主题将深入探讨进程控制的核心内容,主要包括以下四个方面:进程创建、进程终止、进程等待以及进程的程序替换。本文将深入探讨创建与终止的具体操作流程。
一、进程创建
在之前笔者也介绍过进程创建 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;
}
通过运行 , 会有以下现象 :
详细解释 :