通常,当我从bash启动程序时,它会派生bash并从中继承许多东西,比如stdin、stdout。有没有其他方法可以在没有这种设置的情况下运行程序?也许它显式地打开fd1,写一些东西并关闭它?
我遇到了nohup
和disown
。但这两种方法都将正在运行的进程与bash分离,但最初该进程仍然继承自bash。也许有没有一种方法可以启动一个从无到有的过程?
我这么问只是出于好奇,没有任何实际目的。当一个程序在微控制器中运行时,它只是我们的程序在运行,没有额外的设置(如果需要设置,用户必须预先准备(。同样,有没有一种方法,即使在有操作系统的情况下,也可以在没有任何设置的情况下运行程序?
我假设您使用的是Linux。
打印你看到的top -u root
,例如在我的系统上(Ubuntu 20.04 x86_64(:
PID PPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 0 root 20 0 170380 11368 6500 S 0.0 0.0 0:23.52 systemd
2 0 root 20 0 0 0 0 S 0.0 0.0 0:00.61 kthreadd
3 2 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 2 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
5 2 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
10 2 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
11 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
12 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_trace
13 2 root 20 0 0 0 0 S 0.0 0.0 0:04.48 ksoftirqd/0
14 2 root 20 0 0 0 0 I 0.0 0.0 1:28.82 rcu_sched
您可以看到,所有进程最终都继承自PPID(父进程ID(零。
这个进程不是一个进程,它代表Linux调度程序。然后由内核启动systemd(PID1(,并由systemd启动系统中的每个其他进程。
在用户级top -u madfred
3371 1 madfred 20 0 19928 7664 6136 S 0.0 0.0 0:11.62 systemd
3372 3371 madfred 20 0 170404 2460 0 S 0.0 0.0 0:00.00 (sd-pam)
3379 3371 madfred 39 19 659828 16348 12500 S 0.0 0.0 0:02.38 tracker-miner-f
3402 3371 madfred 20 0 8664 5112 3412 S 0.0 0.0 0:00.94 dbus-daemon
3407 3371 madfred 20 0 239712 6740 6064 S 0.0 0.0 0:00.03 gvfsd
有一个user systemd
由root systemd
启动并作为用户运行。该用户系统负责为该用户启动每个进程。
这对于确保Linux操作系统提供的安全、内存保护、文件资源等所有保证是必要的。
您想要的是用其他东西替换内核,这是非常可能的。检查例如:
https://wiki.osdev.org/Bare_bones
https://github.com/contiki-ng/contiki-ng
用自己的自定义初始值设定项替换systemd(或旧的/sbin/init(非常容易。检查这个答案:
编写我自己的init可执行