有沒有辦法找出C標準庫中的哪些函數進行系統調用?他們中的一些人喜歡open
,close
和malloc
是顯而易見的,但是有某種可以查看的列表嗎?像strcpy
這樣的系統調用,或time.h
中的任何功能?C標準庫和系統調用
回答
我假設你從性能的角度來問,因爲在很多情況下,運行時間完全由系統調用支配。現在,雖然這是依賴於實現的(即使存在「系統調用」也依賴於實現),但推理和做出有根據的猜測的一個好方法是將「系統調用」視爲「用戶定義的」內核到用戶「權限轉換,因爲這是系統調用的真正目的。
考慮你的strcpy
的例子。它從一個數組(在你的進程的內存空間)複製一個字符串到另一個數組(也在你的內存空間)。它所做的任何事情都不涉及除這些字符串之外的任何數據,因此作爲此操作的一部分進入內核空間會非常具有病態。
另一方面,考慮從time.h
time
功能。它返回當前系統時間。這是一個共享的系統資源,因此您可能希望它需要進入內核空間來讀取內核當前時間的記錄。傳統上,你會是對的。然而,現代版本的Linux,至少在某些拱門上,將一頁內核內存映射到每個用戶進程中,只讀 - 包含某些只有內核能夠更新的信息的頁面,如系統時間,但所有進程可以自由地從用戶空間讀取而不泄露任何祕密數據。所以這個更模糊。
最後,你有一個像open
或unlink
操作是必須必然涉及一個用戶到內核到用戶的過渡,因爲他們在處理上的權限必須執行共享資源(文件系統)。
如果你想要一個更經驗的方法來回答你的問題,你可以簡單地寫一個簡短的程序來調用你感興趣的每個功能,並在strace
下運行它。
即使'open'也不一定涉及內核轉換。在舊版本的Windows上,如果您打開控制檯文件句柄(例如「CONIN $」),您將獲得用戶模式存根返回的常量句柄(表示「當前控制檯的輸入流」)。我不知道這是否仍然如此。 – arx 2012-02-08 01:21:17
我假設符合POSIX的'open'版本。返回與已打開的文件描述符匹配的文件描述符遠不符合... – 2012-02-08 02:06:09
系統調用是在程序需要與內核通信時進行的。由於這需要中斷,因此strcpy
進行系統調用的效率非常低,你的代碼停止運行,有一個上下文切換,CPU的執行模式改變(有更多的特權),中斷處理程序將運行,你的代碼將繼續。這是假設操作系統不會決定在中斷之後運行另一個進程,或者完全不顧一切地執行代碼(例如在等待讀取時)。
通過問自己:你可以自己回答這個問題:我可以寫這個函數嗎? (可以像:在物理上可行嗎?)您可以編寫自己的strcpy,但不能打開或閱讀。你可以寫你自己的fopen,但它必須打開。
維基百科上有個不錯的list of catagories for system calls。它會給你一個關於什麼時候需要系統調用的好主意。
This顯示如何在程序集中調用interupt(這是唯一可以訪問代碼的地方)。
+1我喜歡「我可以寫這個函數嗎?」作爲教育工具的方法。注意它不完全工作的角落案例,我給出的'時間'例子。 (如果你知道內核在用戶空間內存中映射必要的數據,並知道格式,你可以「寫」時間,但由於內核細節可能改變,所以它會變得脆弱,因此你需要使用內核提供的代碼如果你想避免系統調用。) – 2012-02-08 03:55:29
- 1. 空調系統()採用標準輸出
- 2. C#當量至C`系統()`標準庫函數
- 3. 使用select()系統調用監聽標準輸入和
- 4. 調用C「系統」 ++
- 5. 在C庫函數中調用系統
- 6. 「C系統調用」和「C庫例程」有什麼區別?
- 7. xcodebuild和C標準庫
- 8. 系統()調用用C
- 9. 系統調用讀取和寫入C
- 10. 用WindowChrome複製標準系統菜單?
- 11. 標準系統托盤應用
- 12. Linux系統調用getifaddr C++
- 13. 與c的系統調用
- 14. 系統調用在C++中
- 15. linux系統調用getpeername C++
- 16. Unix系統調用Objective-C
- 17. fork()系統調用c
- 18. 在C系統調用
- 19. 如何覆蓋系統c庫標頭?
- 20. C++回調系統
- 21. 標準緩衝沒有得到清除系統()調用之前
- 22. waitpid()是一個Unix標準系統調用嗎?
- 23. C非標準庫
- 24. 準系統asp.net
- 25. 裝配和系統調用
- 26. R和系統調用
- 27. 更改Epicor ERP10標準系統代碼
- 28. Python中的系統標準聲音
- 29. 系統(「」)調用
- 30. printf和memcpy鏈接到標準C庫
這很可能取決於實施。有沒有你感興趣的特定系統? – templatetypedef 2012-02-08 01:01:06
呃......這就是我所害怕的。 :( – theshadow322 2012-02-08 01:03:24
malloc()並不總是進行系統調用。 – tristan 2012-02-08 01:04:12