2014-10-18 39 views
1

關於c程序的執行,我知道編譯器會將代碼轉換爲機器語言,然後執行。但是我想知道哪些服務是由操作系統提供以完成該操作。說iam使用fopen函數,請解釋我如何操作系統處理它,即。從硬盤讀取文件以加載到內存中等等。對於所有這些操作,哪些系統調用在內部調用?顯式函數如fopen,printf如何轉換爲系統調用? 如果可以在c編程環境中查看內部系統調用,請讓我知道要查看它們的路徑?哪些服務由操作系統提供以執行C程序

+0

函數(而不是函數**調用**)不會轉換爲系統調用。函數只是函數和函數調用,通常轉換爲正常的「CALL」指令。被調用的低級函數反過來可以在彙編中實現,由此編寫e的程序員。 G。 'fopen()'會使用系統調用來讓操作系統把他交給一個打開的文件句柄等。 – 2014-10-18 09:26:37

+0

通常'fopen'函數將在一個庫中,這個函數或者與編譯器捆綁在一起,或者被設計爲與特定編譯器;該函數最終將調用一個操作系統函數(例如Windows中的CreateFile)。操作系統從這一點開始做所有事情。 – 2014-10-18 09:26:46

+0

請你參考上面的代碼詳細解釋我嗎? – 2014-10-18 09:36:17

回答

1

語言通常有自己的API作爲其運行時支持的一部分(例如C的標準庫中的fopen())。這些是語言的一部分,並不完全是操作系統本身的一部分。

該語言的運行時使用操作系統的低層API。例如,fopen()可能使用內核API的open()函數(Linux);但它可能是一個DLL中的函數,而不是內核中的任何東西(Windows)。在某些情況下,它不是那樣的,更像是一個發送到不同進程的消息(微內核通用)。它可能會找到某種「虛擬文件系統」層的方式,並且取決於它是否在VFS的緩存中,它可能會或可能不會從那裏轉發到負責處理文件系統的代碼,該文件系統可能會或可能不會將其轉發給某種存儲設備驅動程序(例如USB閃存設備驅動程序),然後又可能將其轉發給其他設備驅動程序(例如USB控制器驅動程序)。

大多數情況下,它對於不同的操作系統可能會有很大的不同,所以沒有一個答案對所有操作系統都是正確的。

相關問題