Ubuntu上孤儿进程的ppid不是1引出来的思考

今天突然想起来暑假留校的时候运行书上的程序的时候发现其孤儿进程的ppid不是1?当时没有多想,只记得有人说过是因为、Ubuntu的图形界面的问题,然后今天就做了一个实验,来验证一下。(进程的ID是PID)

一 Ubuntu18.04图形界面和字符界面切换

  • 图形界面切换到字符型界面:
    Ctrl+Fn+Alt+F3/Crtl+Alt+F3
  • 字符型界面切换到图形界面:
    Ctrl+Fn+Alt+F2

二 测试

2.1 代码

Ubuntu上孤儿进程的ppid不是1引出来的思考_第1张图片

2.2图形界面结果

Ubuntu上孤儿进程的ppid不是1引出来的思考_第2张图片

2.3 字符界面结果

Ubuntu上孤儿进程的ppid不是1引出来的思考_第3张图片
我们看一下对比,结果还真是的,那这又是为什么呢?

三 原因

在网上查到一个答案,说是Linux系统中子进程只要有一个进程统一负责领养就可以。在Ubuntu 18(桌面版)中,systemd负责领养,所以父进程exit掉的子进程ppid不是1,那下面这张图说明systemd和1关系不简单啊,并且kill systemd的话,系统会重新要求登录(相当于注销的结果)
Ubuntu上孤儿进程的ppid不是1引出来的思考_第4张图片

四 用到的命令

4.1 pidof:用于查找指定名称的进程的进程号id号

首先,想要知道某个名字的进程号。可以使用pidof命令

4.1.1 作用

在这里插入图片描述
官方文档解释:pidof–用于查找一个运行的程序的PID

4.1.2 用法

pidof(选项)(参数)
选项:

  • -s : 仅返回一个进程号
  • -c : 仅显示具有相同"root"目录的进程
  • -x : 显示由脚本开启的进程
  • -o : 指定不显示的进程ID

参数:
进程名称:指定要查找的进程名称

4.1.2.1 普通用法一:不加选项

在这里插入图片描述
这个说明这台Linux服务器上有两个进程都是由systemd程序启动的

4.1.2.2 用法二: 加-s

在这里插入图片描述
只会输出其中一个PID

4.1.2.2 用法三: 加-o

在这里插入图片描述

4.1.3 pidof的返回值
  • 0:表示pidof至少找到了一个对应的PID
  • 1:表示pidof没有找到任何对应的PID
    Ubuntu上孤儿进程的ppid不是1引出来的思考_第5张图片
    通过返回值我们可以变相地判断某个进程是否还在运行
4.1.4 扩展

在这里插入图片描述
我们发现pidof和killall5这两个命令是同一个可执行程序,为什么可以这样?

可以看一下killall5的源代码,程序还总有一个叫readproc()的函数,它实现了遍历/proc目录并从中寻找匹配进程的功能,而pidof和killall5都用到了这个函数所提供的功能,因此,pidof和killall5复用了这一程序

4.2 lsof :显示Linux系统当前已打开的所有文件列表

4.2.1 作用

在这里插入图片描述
列出打开的文件

4.2.2 用法
  • -a : 列出打开文件存在的进程
  • -c<进程名> : 列出指定进程所打开的文件
  • -g : 列出GID号进程详情
  • -d<文件名> : 列出占用该文件号的进程
  • +d<目录>:列出目录下被打开的文件
  • +D<目录>:递归列出目录下被打开的文件
  • -n<目录>:列出使用NFS的文件
  • -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
  • -p<进程号>:列出指定进程号所打开的文件
  • -u:列出UID号进程详情
  • -h:显示帮助信息
  • -v:显示版本信息
4.2.3 输出描述
  • COMMAND : 进程名称
  • PID : 进程标识符
  • PPID : 父进程标识符(需要指定-R参数)
  • USER : 进程所有者
  • PGID : 进程所属组
  • FD : 文件描述符,应用程序通过文件描述符识别该文件
4.2.3.1 文件描述符列表
  • cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
  • txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
  • lnn:library references (AIX)
  • er:FD information error (see NAME column)
  • jld:jail directory (FreeBSD)
  • ltx:shared library text (code and data)
  • mxx :hex memory-mapped type number xx
  • m86:DOS Merge mapped file
  • mem:memory-mapped file
  • mmap:memory-mapped device
  • pd:parent directory
  • rtd:root directory
  • tr:kernel trace file (OpenBSD)
  • v86 VP/ix mapped file
  • 0:表示标准输出
  • 1:表示标准输入
  • 2:表示标准错误
4.2.3.2

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

  • u:表示该文件被打开并处于读取/写入模式
  • r:表示该文件被打开并处于只读模式
  • w:表示该文件被打开并处于
  • 空格:表示该文件的状态模式为unknow,且没有锁定
  • -:表示该文件的状态模式为unknow,且被锁定。
4.2.3.3

同时在文件状态模式后面,还跟着相关的锁:

  • N:for a Solaris NFS lock of unknown type
  • r:for read lock on part of the file
  • R:for a read lock on the entire file
  • w:for a write lock on part of the file;(文件的部分写锁)
  • W:for a write lock on the entire file;(整个文件的写锁)
  • u:for a read and write lock of any length
  • U:for a lock of unknown type
  • x:for an SCO OpenServer Xenix lock on part of the file
  • X:for an SCO OpenServer Xenix lock on the entire file
  • space:if there is no lock.
4.2.3.4

文件类型:

  • DIR:表示目录
  • CHR:表示字符类型
  • BLK:块设备类型
  • UNIX: UNIX 域套接字
  • FIFO:先进先出 (FIFO) 队列
  • IPv4:网际协议 (IP) 套接字
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

因资历尚浅,所以本文如有错误请留言我并改正!

你可能感兴趣的:(Linux,C,命令)