进程的创建

进程的创建和进程状态

进程创建

在C语言中我们用fopen,写的方式打开一个文件,如果这个文件不存在,它会在我们现在正在执行程序的目录下创建这个文件,这是如何做到的呢?
在这里插入图片描述
我们以写的方式打开一个test.c的文件
在这里插入图片描述
执行完之后,当前文件夹就有了一个叫test.c的文件,那么操作系统是如何操作的呢?
在这里插入图片描述
通过上面这个图我们先用ps ajx | head -1&& ps ajx | grep mytest 这个命令知道mytest这个程序的pid后我们进入/proc这个文件夹下面查询,可以看到一个叫cwd的这个就是当前可执行程序的当前路径,操作系统一般就是在当前的路径下创建,当然我们也可以修改路径
在这里插入图片描述
之后就在对应的路径下创建了tmp.c文件
在这里插入图片描述

同时我们查看proc中的文件发现对应路径也已经更改
在这里插入图片描述

fork函数

除了上面的方式Linux中还可以使用fork函数来创建进程,可以用getpid来获取子进程pid,getppidl来获取父进程的id

在这里插入图片描述
先来看一下这个代码的含义,在调用fork函数之前我们先打印出pid和ppid,然后fork后再打印一次,那么结果会是两行分别是父进程的pid,ppid以及子进程的pid和ppid吗?
在这里插入图片描述
结果为什么是三行呢???(大为震撼)
先告诉结果:因为调用fork函数后父子进程共享代码!
那么什么又是共享代码呢?
因为我们知道进程=内核PCB+可执行程序代码和数据,当我们创建子进程的时候,是以父进程为模板创建的,既把父进程的PCB内容拷贝到子进程的PCB中,并且共享父进程它的可执行程序的代码,(数据的话简单提一句,如果会对数据进行修改,会把数据重新拷贝一份到子进程,子进程修改的数据是拷贝的而非父进程中的),这也叫做写实拷贝,所以父子进程都会执行fork函数后的printf打印,所以我们知道了结果是打印三行的原因!

接下来继续看一个场景
在这里插入图片描述
在这里插入图片描述
先不用管pid_t是什么,为什么id通过if else判断两个语句都能进入呢?

下面我们用man手册查看fork函数的返回值问题
在这里插入图片描述

这应该就能解释id为什么能进入两个判断语句中,我们知道一个程序当执行到return
0的时候逻辑已经执行完了对吧,fork也是如此,当fork函数执行完逻辑后就已经产生了子进程,这时候父进程和子进程一起return,所以就会有两个返回值,根据手册,如果成功,返回子进程pid给父进程,返回0给子进程!!

那为什么返回值这样规定呢?我们可以想象生活中的例子对吧,以前的皇帝可以有多个儿子,所以他需要知道每个儿子的“pid”来进行管理,那他的儿子只需要“返回0即可”,因为他们只有一个共同的父亲。

Linux中,从这里也可以看出同一个变量id可以表示不同的内存!

并且两个进程之间是不影响的,父进程结束子进程不会被影响
在这里插入图片描述
图中我们写了一个循环代码来打印父子进程,可以看到kill父进程后,子进程还在运行
右边查看进程状态的命令:while :; do ps ajx | head -1&& ps ajx | grep mytest | grep -v grep; sleep 1; done

进程排队

前面我们知道进程=内核数据结构+可执行程序
其实Linux中task_struct的数据结构和我们在C语言中学习的是有差别的,Linux中相当于存在一个struct Listnode结构体,里面包含一个next和prev指针,而我们的task_struct中存放的是这个Listnode结构体的对象,是通过这些个对象来链接彼此的,
如下面这个图

在这里插入图片描述
那我们只是链接了listnode,我们怎么找到task_struct中对应的变量呢?答案是:偏移量
在结构体中,我们可以用地址加偏移量的方式来找到对应的元素,那么这里是同样的,我们知道了listnode对象n的地址,那么(task_struct)((&n-(task_stuct*)0->n))就可以找到tast_struct的成员。

并且tast_struct中可以有多种的这些数据结构,当我们要管理它们的时候把它们放入双向链表,当我们需要进程排先后顺序的时候,我们不用把它们从双向链表里拿出来,而是可以直接把相应的队列的数据结构放入其中,这样我们就可以同时的进行许多的操作。

那么什么又是进程排队呢?
进程总得要有一个执行的先后顺序吧,就是把tast_struct中的数据结构放入队列当中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值