next up previous
Next: 我要怎樣經由 rsh 執行遠方指令時,檢查遠方指令的結束狀態? Up: 中級的問題 Previous: 我要怎麼在一個 shell script 中或在背景執行  'ftp'

在 shell script 或 C 程式當中,要怎樣才能找到某個程式的 process ID 呢?

在 shell script 當中:

沒有現成的程式可以用來查詢程式名稱與 process ID 之間的對應。此外, 如果有對應的話,通常也都不太可信,因為可能會有多個 process 執行同一 個名稱的程式,而且 process 在啟動之後仍可修改自己的名稱。然而,如果 您真的想要得知執行某個特定程式的所有 process, 可以利用以下命令行達 成:

		ps ux | awk '/name/ && !/awk/ {print $2}'
您可以把 "name" 換成您想尋找的程式名稱。

這個命令行的基本觀念是分析 ps 程式的輸出,然後用 awk或grep等公用 程式來搜尋具有特定名稱的文字行,然後把這些文字行當中的 PID 欄位印 出來。值得注意的是此例的命令行用了 "!/awk/" 以避免 awk 的 process 也被列出來。

您可能要根據您所用的 Unix 種類來調整 ps 所用的參數。

在 C 語言程式裡面:

在 C 的程式庫裡面一樣沒有(具有可攜性)的函數可以找出程式名稱與 process IDs。

然而有些廠商提供函數讓您能讀取 Kernel 的記憶體,例如 Sun 提供了 kvm_ 開頭的函數,Data General 則提供了 dg_ 開頭的函數。如果您的系 統管理員未限定 Kernel 記憶體的讀取權力的話(一般只有 super user 或 kmem 群組裡的人員才能讀取 Kernel 記憶體),一般使用者也可以利用這 些特殊函數來達到目的。然而,這些函數通常沒有正式的文件說明,就算有 的話也都寫得艱深難懂,甚至會隨著系統版本的更新而改變。

有些廠商會提供 /proc 檔案系統,此檔案系統存在的方式為一個內含多個檔 案的目錄。每個檔名都是一個數字,對應於 process ID,您可以開啟這個檔 案並且讀取關於這個 process 的資訊。再次提醒一下,有時候您會因為存取 權限的限制而無法使用這些功能,而且使用這些功能的方式也隨著系統而 變。

如果您的廠商並沒有提供特殊的程式庫或者 /proc 來處理這些事,但是您又 想要在 C 裡面完成這些功能,那麼您可能要自己在Kernel 記憶體當中費心 搜尋。如果您想看看這些功能在某些系統上是怎麼做到的,可以參考 ofiles 的原始程式,您可以從 comp.source.sources.unix 的歷年歸檔文章當中取 得。(有一個稱為 kstuff 的套裝程式曾經在 1991 年五月發表於 alt.sources,它可以幫您在 kernel 當中搜尋有用的資訊,您可以到 wuarchive.wustl.edu 利用匿名 ftp 取回 usenet/alt.sources/articles/3296,7,8,9,3300,1.Z。)



Tan Koan-Sin
1999-03-02