3 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
在Linux(和其他Unixy系統(tǒng)也許),你會(huì)發(fā)現(xiàn)一個(gè)符號(hào)鏈接到實(shí)際運(yùn)行可執(zhí)行文件作為pid
下/proc/pid/exe
,檢查一個(gè)會(huì)給你想要的東西,如果它是一個(gè)二進(jìn)制。如果它是某種腳本,那可能只會(huì)給解釋器。
但請(qǐng)注意,完全有可能啟動(dòng)一個(gè)進(jìn)程并在它運(yùn)行時(shí)刪除可執(zhí)行文件,留下懸空鏈接或什么都不留下。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
這將取決于語(yǔ)言,但據(jù)我所知,大多數(shù)編程語(yǔ)言都可以獲取程序的“基本名稱”(例如 helloworld)或完整路徑(例如 /usr/bin/helloworld)。通常這作為程序的第一個(gè)參數(shù)提供,由操作系統(tǒng)/運(yùn)行時(shí)庫(kù)/解釋器等插入。 例如,在 C 中,argv[0](因?yàn)槲覀冊(cè)?C 中從 0 開(kāi)始計(jì)數(shù))給出當(dāng)前的名稱程序,但是調(diào)用過(guò)程會(huì)初始化這個(gè)特殊參數(shù),因此確切的格式可能會(huì)有所不同,并且在 bash 中, $0 將擴(kuò)展為執(zhí)行時(shí)給定的腳本路徑(我認(rèn)為)。從這里:https : //gobyexample.com/command-line-arguments, “os.Args 提供對(duì)原始命令行參數(shù)的訪問(wèn)。請(qǐng)注意,此切片中的第一個(gè)值是程序的路徑,而 os.Args[1:] 保存程序的參數(shù)?!?nbsp;所以看起來(lái)你不需要擔(dān)心 /proc 但如果你有興趣,我如何在 C 中找到可執(zhí)行文件的位置?

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
導(dǎo)出的變量os.Args(它是一個(gè)切片:)[]string保存程序參數(shù),它的第一個(gè)元素是帶有完整路徑的可執(zhí)行文件名稱。
如果可執(zhí)行文件不是符號(hào)鏈接,您可以使用path或filepath包來(lái)獲取可執(zhí)行文件的文件夾,如下所示:
folder := filepath.Dir(os.Args[0])
并且您可以使用os.Readlink()來(lái)解析符號(hào)鏈接。
并且要測(cè)試您的可執(zhí)行文件是否是符號(hào)鏈接,您可以使用os.Lstat()which 不嘗試跟隨鏈接(而不是os.Stat())。
所以你的最終版本應(yīng)該是這樣的:
s := os.Args[0]
fi, err := os.Lstat(s)
if err != nil {
panic(err) // Failed to get stats
}
// Check if it's a symlink and if so, try to resolve it
if fi.Mode()&os.ModeSymlink != 0 {
if s, err = os.Readlink(s); err != nil {
panic(err) // Failed to resolve symlink
}
}
s = filepath.Dir(s) // We only want the folder part
- 3 回答
- 0 關(guān)注
- 236 瀏覽
添加回答
舉報(bào)