在操作系统中运行程序最简单的方法是什么



通常,当我从bash启动程序时,它会派生bash并从中继承许多东西,比如stdin、stdout。有没有其他方法可以在没有这种设置的情况下运行程序?也许它显式地打开fd1,写一些东西并关闭它?

我遇到了nohupdisown。但这两种方法都将正在运行的进程与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 systemdroot systemd启动并作为用户运行。该用户系统负责为该用户启动每个进程。

这对于确保Linux操作系统提供的安全、内存保护、文件资源等所有保证是必要的。

您想要的是用其他东西替换内核,这是非常可能的。检查例如:

https://wiki.osdev.org/Bare_bones

https://github.com/contiki-ng/contiki-ng

用自己的自定义初始值设定项替换systemd(或旧的/sbin/init(非常容易。检查这个答案:

编写我自己的init可执行

相关内容

最新更新