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;   
}

文章目录