往期问答汇总:
- 粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数
- 一个端口号可以同时被两个进程绑定吗?
- 两个线程,两个互斥锁,怎么形成一个死循环?
- 一个例子让你看清线程调度的随机性
- 5. 从0开始学ARM-MRS、MSR、寻址操作、原子操作原理
一、粉丝提问
fork出的进程的父进程是从哪来的?
粉丝提问,一口君必须满足
二、解答
这个问题看上去很简单,但是要想把进程的父进程相关的所有知识点搞清楚,还是有点难度的,下面我们稍微拓展下,分几点来讲解这个知识点。
1. 如何查看进程ID
每个linux进程都一定有一个唯一的数字标识符,称为进程ID(process ID),进程ID总是一非负整数,它的父进程叫PPID。
查看进程ID命令:
ps -ef
也可以使用函数来获得进程ID:
#include #include pid_t getpid(void); 返回:调用进程的进程IDpid_t getppid(void); 返回:调用进程的父进程ID
2. 第一个进程init
Linux内核启动之后,会创建第一个用户级进程init,由上图可知, init 进程 (pid=1) 是除了 idle 进程 (pid=0,也就是 init_task) 之外另一个比较特殊的进程,它是 Linux 内核开始建立起进程概念时第一个通过 kernel_thread 产生的进程,其开始在内核态执行,然后通过一个系统调用,开始执行用户空间的 / sbin/init 程序。
3. fork函数
创建一个进程很简单,先来认识一下fork函数:
#include #include pid_t fork(void);返回:子进程中为0,父进程中