2013-03-27 78 views
6

由於某些原因,我需要調用一些系統調用(Linux) 我檢查了'syscall'包的文檔,但找不到任何關於它的信息。如何在golang中調用Linux/UNIX的系統調用

然後我剛看到一個包裝Windows API的項目(https://github.com/AllenDang/w32/blob/master/kernel32.go)。我讀了一下它的源代碼。

它使用

modkernel32 = syscall.NewLazyDLL("kernel32.dll") 

加載動態庫。但是,沒有函數的文檔NewLazyDLL()

我確定應該有一個類似的函數用於Linux/UNIX。有沒有人可以告訴我函數的名稱或在Golang中調用Linux的系統調用的方法,或者從libc.so中加載函數 ?

更多細節

我想要調用系統調用「服務」或「叉」(我想守護進程的過程中),因爲我無法找到golang庫提供他們。

+0

你想要做什麼? 'syscall'軟件包是直接系統調用接口的正確軟件包,但如果不知道自己想做什麼,很難給出任何建議。你不會在包的UNIX版本中發現DLL加載,因爲它不是系統調用接口的一部分。 – 2013-03-27 06:20:25

+0

感謝James的回覆。實際上我只是想知道如何獲得系統調用接口。 – 2013-03-27 06:30:27

回答

4

目前Go標準庫中沒有daemon樣式函數。有an open bug about adding such a feature,但它已被推遲到Go 1.1發佈之後。我建議閱讀錯誤報告,因爲它不像它最先出現的那麼簡單。

除了擁有守護進程fork本身,還有其他一些方法可以運行守護進程。例如,像Upstart和Systemd這樣的現代init守護進程可以爲你管理這些守護進程。

+0

謝謝詹姆斯。我不會在我的程序中使用fork /守護進程,但我仍然想知道如何調用unix的系統調用。我發現有兩個稱爲Syscall/Syscall6的函數,但沒有任何文檔。這兩個函數可以用來調用unix的系統調用嗎? – 2013-03-27 23:17:11

+0

'systemcall'包中的函數使您可以訪問大多數系統調用(正如您在問題中正確推測的那樣)。例如,'syscall.Read'將調用'SYS_read'系統調用。如果您所追求的特定系統調用未被該軟件包覆蓋,請特別詢問它們。上面的答案涵蓋了關於對進程進行守護的具體問題。 – 2013-03-28 01:25:00

+0

syscall軟件包公開了(幾乎)所有平臺的系統調用。這個軟件包的內容在不同的平臺上有所不同。使用帶有平臺後綴的源文件,例如foo_linux.go和foo_windows.go。去構建將只編譯具有匹配後綴的文件。這是將平臺相關代碼分解出來的一種很好且乾淨的方法。 – fuz 2013-03-31 21:17:24