在linux当中新的进程往往是通过父进程创建出来的
那应该怎么创建?
我们发现我们大部分程序都是有一个ppid的代码,这个就是他父进程的id,我们发现无论这个程序运行还是关闭之后再一次运行,它的ppid都是不变的,
说明他就是有一个父进程运行起来的,这个是Bash(命令行解释器)
那么到底是怎样创建的呢?
本质上是os内部多了一个进程重新生成了一个task_struct+代码数据
如何多呢?
是通过了一个系统函数的调用fork()
fork
在代码中使用fork之后就有两个执行流一个是原来的,一个是被创建的子进程
在bash'中也是通过fork来进行创建的
proc
在我们的系统中有这个文件夹叫/proc
这个文件里面是全部正在运行的进程
这些进程都是以文件夹的形式存在
打开之后就会显示此进程的属性
cwd
在进程的文件夹中存在一个pwd
这里面是我们这个进程当前的路径,我们如果开一个新的文件,不写任何路径,就默认在cwp这个路径下,
注意cwp:显示的是这个程序是存在那个问价夹里面的
chdir
我们可以通过chdir改变当前路径,就是改变cwd
linux进程也和linux一样是树状结构
fork
fork之后代码是共享的,所以一般我们需要分流

就如图,我们需要考虑返回值的问题
返回值:成功了会存在两个返回值
返回0表示子进程
返回其他数(id)就代表父进程
fork一下,一个代码两个进程
子问题
1.为什么子进程返回的是0,父进程返回的是子进程的id?
一个父进程可以有多个子进程,一个子进程只能有一个父进程
所以给父进程返回id用于管理不同的孩子
而孩子只需要用0来进行标记即可
2.为什么会存在两个返回值?
return也是代码呀
我们上面说了父子用一套代码,两个工作流,两个进程,所以两个返回值不是很正常吗
进程状态
有三种运行
阻塞
挂起
运行:在cpu中会存在一个栈来储存正在被执行或者将要被执行的进程,故:我们就说只要是子啊这个站里面的我们都是运行状态的进程
阻塞:当我们一个代码遇到scanf或者cin》》的时候
程序就会停下来
我们在等什么?
在等硬件就绪(在这里也就是键盘)
那么谁是第一个知道的呢?
操作系统
why
因为他是管理硬件的
,要是没有从硬件中读到数据,说明硬件就还没有准备好
故就会从运行状态转移到阻塞状态