簡體   English   中英

在操作系統中運行程序的最簡單的方法是什么?

[英]What is the most minimalistic way to run a program inside an OS?

通常,當我從 bash 啟動程序時,它會分叉 bash 並從中繼承許多東西,例如標准輸入、標准輸出。 有沒有其他方法來運行程序,沒有這樣的設置? 也許它明確地打開 fd 1,寫一些東西並關閉它?

我遇到了nohupdisown 但是這兩個都從 bash 中分離出一個正在運行的進程,但最初該進程仍然繼承自 bash。 也許有一種方法可以啟動一個從無到有的進程?

我只是出於好奇而問這個,並沒有實際目的。 當一個程序在微控制器中運行時,它只是我們的程序在運行而沒有額外的設置(如果需要設置,用戶必須預先設置)。 同樣,有沒有一種方法,即使在存在操作系統的情況下,也可以運行所編程的內容,而無需任何設置?

我假設您使用的是 Linux。

在我的系統(Ubuntu 20.04 x86_64)上打印你看到的top -u root

    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 (PID 1) 由 kernel 啟動,系統中的所有其他進程由 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啟動並以用戶身份運行。 該用戶 systemd 負責為該用戶啟動每個進程。

這對於確保 Linux 操作系統提供的所有保證是必要的,例如安全性、memory 保護、文件資源等。

您想要的是用其他東西替換 kernel,這是很有可能的。 檢查例如:

https://wiki.osdev.org/Bare_bones

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

用您自己的自定義初始化程序替換 systemd(或舊的 /sbin/init)非常容易。 檢查這個答案:

編寫我自己的 init 可執行文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM