linux pid
LINUX PID
Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2)
idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。
参考博客:https://www.cnblogs.com/softidea/p/7219455.html
各个进程的主要职责:
* idle进程(PID = 0,swapper,也叫idle)
由系统自动创建, 运行在内核态 ,创建了第一个用户进程(init进程(PID = 1) /sbin/init)和通过kernel_thread创建第一个内核进程kthreadd(PID = 2) 之后idle进程(PID = 0)进入idle状态,当没有进程可以被调度的时候运行该进程,不做具体的事情。即 完成加载系统后,演变为进程调度、交换。
*init进程
完成系统的初始化. 是系统中所有其它用户进程的祖先进程。主要作用是处理僵尸进程。当某个父进程比子进程提前消亡时,父进程会给子进程重新寻找“养父进程”,一般就是进程1,由进程1负责处理该子进程的消亡。
首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。在系统启动完成完成后,init将变为守护进程监视系统其他进程。
*kthreadd进程
由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理.
它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthreadd的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程
测试代码:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid=fork();
if(pid==0)
{
printf("\ni am child\n");
printf("My process id is %d\n",getpid());
printf("My Parents's process id is %d\n",getppid());
}
else
{
printf("i am parent\n");
printf("My process id is %d\n",getpid());
printf("My parents's process id is %d\n",getppid());
//等一会儿让儿子读到getppid,这样就会显示到真实的父进程的pid
//如果这里不等,父进程结束了,子进程成了没爸爸的孩子,就来了个系统分配的干爸爸,pid就变成了1,
//sleep(1);
}
return 0;
}