我知道以下是 Linux 中进程启动的方式
- 来自 init.d (或类似的)
- 来自 shell(由用户)
- 由正在运行的本机守护进程派生
在 Linux 上是否有可能启动一个不属于上述类别的进程?例如,是否可以在用户不知情的情况下启动流程?
答案1
在Linux上,几乎所有流程(包括服务器和守护程序)开始于叉子(2)(有时在标准 C 库中使用克隆(2))经常跟随执行(2)系统调用。这守护进程(3)库函数使用这些(以及其他一些)系统调用(列于系统调用(2)....)
唯一的例外情况是很少由内核神奇地启动的进程。这些包括:
init
存在于 1980 时代的 Unixes(例如 SunOS3)。 AFAIK,自动启动的hotplug
类似进程是最近的 Linux 添加(可能是 Linux 3,或至少 2.6,另请参阅乌德夫)
大多数程序和进程(包括login
, bash
, getty
, cron
, atd
, mysqld
)都是 & 的后代,init
您fork
基本上execve
可以忽略例外(例如hotplug
),并且您可以拥有一个 Linux 系统,其中每个进程都是 的后代init
(Linux 1.0 就是这种情况)。 x 上个世纪的内核)。使用树(1)查看进程树。
阅读维基页面有关Linux启动流程&从 PowerUp 到 Bash 提示符(这可能有点过时,但大部分仍然是正确的)。
设置用户标识是一种与特权相关的巧妙机制(另请参见塞特鲁伊德(2),凭证(7),能力(7),命名空间(7))。
我推荐阅读高级Linux编程首先。在那本书之后出现了一些功能或系统调用(例如信号fd(2),inotify(7),电子轮询(7)....)。