2012-02-08 89 views
4

有沒有辦法找出C標準庫中的哪些函數進行系統調用?他們中的一些人喜歡open,closemalloc是顯而易見的,但是有某種可以查看的列表嗎?像strcpy這樣的系統調用,或time.h中的任何功能?C標準庫和系統調用

+2

這很可能取決於實施。有沒有你感興趣的特定系統? – templatetypedef 2012-02-08 01:01:06

+0

呃......這就是我所害怕的。 :( – theshadow322 2012-02-08 01:03:24

+0

malloc()並不總是進行系統調用。 – tristan 2012-02-08 01:04:12

回答

7

我假設你從性能的角度來問,因爲在很多情況下,運行時間完全由系統調用支配。現在,雖然這是依賴於實現的(即使存在「系統調用」也依賴於實現),但推理和做出有根據的猜測的一個好方法是將「系統調用」視爲「用戶定義的」內核到用戶「權限轉換,因爲這是系統調用的真正目的。

考慮你的strcpy的例子。它從一個數組(在你的進程的內存空間)複製一個字符串到另一個數組(也在你的內存空間)。它所做的任何事情都不涉及除這些字符串之外的任何數據,因此作爲此操作的一部分進入內核空間會非常具有病態。

另一方面,考慮從time.htime功能。它返回當前系統時間。這是一個共享的系統資源,因此您可能希望它需要進入內核空間來讀取內核當前時間的記錄。傳統上,你會是對的。然而,現代版本的Linux,至少在某些拱門上,將一頁內核內存映射到每個用戶進程中,只讀 - 包含某些只有內核能夠更新的信息的頁面,如系統時間,但所有進程可以自由地從用戶空間讀取而不泄露任何祕密數據。所以這個更模糊。

最後,你有一個像openunlink操作是必須必然涉及一個用戶到內核到用戶的過渡,因爲他們在處理上的權限必須執行共享資源(文件系統)。

如果你想要一個更經驗的方法來回答你的問題,你可以簡單地寫一個簡短的程序來調用你感興趣的每個功能,並在strace下運行它。

+0

即使'open'也不一定涉及內核轉換。在舊版本的Windows上,如果您打開控制檯文件句柄(例如「CONIN $」),您將獲得用戶模式存根返回的常量句柄(表示「當前控制檯的輸入流」)。我不知道這是否仍然如此。 – arx 2012-02-08 01:21:17

+0

我假設符合POSIX的'open'版本。返回與已打開的文件描述符匹配的文件描述符遠不符合... – 2012-02-08 02:06:09

1

系統調用是在程序需要與內核通信時進行的。由於這需要中斷,因此strcpy進行系統調用的效率非常低,你的代碼停止運行,有一個上下文切換,CPU的執行模式改變(有更多的特權),中斷處理程序將運行,你的代碼將繼續。這是假設操作系統不會決定在中斷之後運行另一個進程,或者完全不顧一切地執行代碼(例如在等待讀取時)。

通過問自己:你可以自己回答這個問題:我可以寫這個函數嗎? (可以像:在物理上可行嗎?)您可以編寫自己的strcpy,但不能打開或閱讀。你可以寫你自己的fopen,但它必須打開。

維基百科上有個不錯的list of catagories for system calls。它會給你一個關於什麼時候需要系統調用的好主意。

This顯示如何在程序集中調用interupt(這是唯一可以訪問代碼的地方)。

+0

+1我喜歡「我可以寫這個函數嗎?」作爲教育工具的方法。注意它不完全工作的角落案例,我給出的'時間'例子。 (如果你知道內核在用戶空間內存中映射必要的數據,並知道格式,你可以「寫」時間,但由於內核細節可能改變,所以它會變得脆弱,因此你需要使用內核提供的代碼如果你想避免系統調用。) – 2012-02-08 03:55:29