2013-07-15 72 views
2

而不是使用this或任何其他C庫我想在C中實現我自己的chmod,以通過代碼更改文件許可權,以便了解更改文件權限時在後端發生的情況。任何幫助將不勝感激。手動更改C文件權限

回答

3

Libc爲您提供獨立於cpu架構的系統調用方式。 chmod或任何其他系統調用的功能是將你的函數調用參數移動到正確的寄存器或堆棧上的正確位置,加上一個特殊的值,表示正在調用哪個系統調用(對於Linux上的chmod,這恰好是90,MacOS-15)然後使用所需的任何指令或指令序列來使內核接管並執行系統調用。當內核返回到userland時,它有一種方法可以將錯誤傳回給用戶。如果錯誤不是0,則libc系統調用包裝將它放入全局變量errno,並返回指示錯誤。在大多數系統調用中,錯誤返回值是-1,因此libc程序員可以懶惰,並且對所有系統調用使用相同的包裝,而不是爲每個系統調用編寫特定的調用(這通常是通過某種彙編程序生成宏或腳本來完成的) 。

如果你想深入挖掘內核,它會變得更加複雜。當看到syscall指令時,CPU將其上下文設置爲內核模式,其中包括更改堆棧指針和一堆其他寄存器,並跳轉到先前設置的用於處理系統調用的代碼(這是cpu架構和操作系統相關的)。它通常以一個通用的系統調用處理程序開始,該處理程序檢查系統調用號碼是否有效,從cpu認爲將它們放入內核認爲它們應該在的位置移動參數,然後查找函數調用來處理這個特定的系統調用並調用它。當該函數返回時,它通常會返回一個通用的syscall處理程序的錯誤代碼,以便將其轉回給用戶。

更深入。實現chmod系統調用的特定函數首先檢查參數(模式是合理的),然後執行兩件事。首先它調用一個非常複雜的函數,將文件名轉換爲表示我們感興趣的文件的內部對象(更確切地說,以及與文件名關聯的對象,因爲chmod是名稱級操作,而不是文件級操作,長篇故事)。這個對象在不同的​​操作系統中被稱爲不同的東西,通用名稱是「inode」或「vnode」。該對象具有某種附加的結構,可以使用函數指針指向可以在該對象上進行的大量不同操作。這樣做是爲了使內核可以支持許多不同的文件系統。這是一個面向對象的方法。其中一個函數叫做setattr(即使操作系統可以按照自己的意願命名,setattr通常被使用,因爲每個人都是相互竊取的,NFS中的操作也稱爲SETATTR)。 chmod syscall函數爲setattr設置參數,告訴它更改文件的權限,調用文件系統特定的setattr,處理錯誤返回並將其傳遞迴通用syscall處理程序。

(我可以去更深下到如何一個文件名和一個節點對象之間的轉換已完成,但我不會。這個主題是複雜的,足以寫成一本書。)

更深了。文件系統特定的setattr通常只是從磁盤更改文件系統對象的內存中副本,將其標記爲髒並將其放入隊列以便稍後寫出到磁盤。如果你的文件系統爲屬性改變強制執行某種同步模式(這會使文件系統變得非常慢),你可以戳磁盤寫入器,儘快將修改過的對象寫出到磁盤上並等待它完成。通常情況下,你只是希望無論寫入磁盤什麼時候都會出現,並且修改後的權限會被寫出來。這就是爲什麼當系統崩潰或斷電時,您可能會丟失文件系統更改。請注意,如果事情被寫入磁盤或沒有寫出來,則無關緊要,因爲使用文件系統的每個人都在使用相同的內核和相同的功能以及相同的內存中的文件系統對象副本。這結束setattr的工作,然後它將錯誤代碼返回到chmod系統調用處理程序。

+0

我可以進入數據如何去到磁盤,但我懷疑任何人會閱讀所有的喋喋不休。 – Art

5

...我想裏用C實現我自己的文件模式...學會在後臺發生了什麼......

C庫封裝系統的這些功能部件依賴。

如果您想知道C庫及其後的內容,您需要知道您的特定系統如何調用內核 - 對於Linux x86,這是例如INT 0x80指令。例如,請參閱https://en.wikipedia.org/wiki/System_call以開始。

要了解每個C函數內部工作,我建議你獲取GNU C庫源代碼,並研究它們:見http://sourceware.org/git/?p=glibc.git

+0

謝謝!確實會有幫助! :) – sadaf2605

+0

@ sadaf2605好的:-)其實你的問題是相當開放的,可以更具體地回答,但是如果你對我的答案中的某些關鍵字(如系統調用)進行谷歌搜索,你應該得到大量的材料來通過;) –

+0

是的@Andreas,我也在尋找關鍵字:) – sadaf2605