Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
手动更改C中的文件权限_C_Unix_Chmod - Fatal编程技术网

手动更改C中的文件权限

手动更改C中的文件权限,c,unix,chmod,C,Unix,Chmod,我不想使用chmod或任何其他C库,而是想在C中实现我自己的chmod来通过代码更改文件权限,以了解更改文件权限时后端会发生什么。任何帮助都将不胜感激。Libc为您提供了一种独立于cpu体系结构的系统调用方式。chmod或任何其他系统调用所做的是将函数调用参数移动到正确的寄存器或堆栈上的正确位置,再加上一个特殊值,说明调用的是哪个系统调用(对于Linux上的chmod,这恰好是90,MacOS-15)然后使用使内核接管并执行系统调用所需的任何指令或指令序列。当内核返回到userland时,它可以

我不想使用chmod或任何其他C库,而是想在C中实现我自己的chmod来通过代码更改文件权限,以了解更改文件权限时后端会发生什么。任何帮助都将不胜感激。

Libc为您提供了一种独立于cpu体系结构的系统调用方式。
chmod
或任何其他系统调用所做的是将函数调用参数移动到正确的寄存器或堆栈上的正确位置,再加上一个特殊值,说明调用的是哪个系统调用(对于Linux上的chmod,这恰好是90,MacOS-15)然后使用使内核接管并执行系统调用所需的任何指令或指令序列。当内核返回到userland时,它可以将错误传回给用户。如果错误不是0,则libc syscall包装器将其放入全局
errno
变量中,并返回指示错误的结果。在大多数系统调用上,错误返回为-1,因此libc程序员可能会很懒惰,对所有系统调用使用相同的包装,而不是为每个系统调用编写特定的包装(这通常通过某种汇编程序生成宏或脚本来完成)

如果您想在内核内部进行更深入的挖掘,它会变得更复杂。CPU在看到syscall指令时,会将其上下文设置为内核模式,其中包括更改堆栈指针和一组其他寄存器,并跳转到先前设置的代码以处理syscall(这既取决于CPU体系结构,也取决于操作系统)。它通常从一个通用的系统调用处理程序开始,该处理程序检查系统调用号是否有效,将参数从cpu认为最好的位置移动到内核认为应该的位置,然后查找要调用的函数来处理这个特定的系统调用并调用它。当该函数返回时,它通常返回一个错误代码,以便泛型系统调用处理程序将其翻译回用户

更深一层。实现chmod系统调用的特定函数首先检查参数(模式是否正常),然后做两件事。首先,它调用一个非常复杂的函数,将文件名转换为表示我们感兴趣的文件的内部对象(或者更确切地说,是与文件名关联的对象,因为chmod是名称级操作,而不是文件级操作,说来话长)。该对象在不同的操作系统中被称为不同的对象,常见的名称是“inode”或“vnode”。该对象具有某种结构,并带有指向可在该对象上执行的许多不同操作的函数指针。这样做是为了使内核能够支持许多不同的文件系统。这是一种面向对象的方法。其中一个函数称为
setattr
(尽管操作系统可以自由地按照它们想要的方式命名事物,但setattr通常被使用,因为每个人都会相互窃取,NFS中的操作也被称为setattr)。chmod syscall函数为setattr设置参数,告诉它更改文件的权限,调用特定于文件系统的
setattr
,处理错误返回并将其传递回通用syscall处理程序

(我可以更深入地了解文件名和节点对象之间的转换是如何完成的,但我不会。这个主题非常复杂,足以填满一本书。)

更深一层。特定于文件系统的
setattr
通常只是更改磁盘上文件系统对象的内存副本,将其标记为脏,并将其放入队列中,以便稍后写入磁盘。如果您的文件系统对属性更改强制某种同步模式(这会使文件系统非常非常慢),那么您可以戳磁盘写入器,尽快将修改后的对象写入磁盘,并等待它完成。不过,通常情况下,您只希望写入磁盘的内容在某个时候能够恢复,并将修改后的权限写入磁盘。这就是为什么在系统崩溃或断电时会丢失文件系统更改。请注意,事情是否写入磁盘并不重要,因为使用文件系统的每个人都使用相同的内核、相同的函数和相同的文件系统对象内存副本。这就结束了
setattr
的工作,然后将错误代码返回给
chmod
syscall处理程序

。。。我想在C中实现我自己的chmod。。。要了解后端发生了什么

C库封装了这些函数的系统相关部分

如果您想知道C-library内外的情况,您需要了解特定系统如何调用内核-对于Linux x86,这是例如
int0x80
指令。请参见示例以开始


要了解每个C函数在内部是如何工作的,我建议您获取GNU C库源代码并研究它们:请参见

谢谢!的确,这会有所帮助的!:)@sadaf2605好:-)事实上,你的问题很容易得到更具体的回答,但是如果你在谷歌上搜索我的答案中的一些关键词(比如系统调用),你应该会得到大量的材料;)是的,@Andreas,我也在寻找关键词:)我可以了解数据是如何进入磁盘的,但我怀疑有人会读到这些胡言乱语。