Linux程序设计(第4版)
上QQ阅读APP看书,第一时间看更新

3.7 文件和目录的维护

标准库和系统调用为文件和目录的创建与维护提供了全面的支持。

3.7.1 chmod系统调用

你可以通过chmod系统调用来改变文件或目录的访问权限。这构成了shell程序chmod的基础。

该函数原型如下:

path参数指定的文件被修改为具有mode参数给出的访问权限。参数mode的定义与open系统调用中的一样,也是对所要求的访问权限进行按位OR操作。除非程序被赋予适当的特权,否则只有文件的属主或超级用户可以修改它的权限。

3.7.2 chown系统调用

超级用户可以使用chown系统调用来改变一个文件的属主。

这个调用使用的是用户ID和组ID的数字值(通过getuid和getgid调用获得)和一个用于限定谁可以修改文件属主的系统值。如果已经设置了适当的特权,文件的属主和所属组就会改变。


POSIX规范实际上允许非超级用户改变文件的属主。虽然所有“正确的”POSIX系统都不允许这样做,但严格来说,这是它的一个扩展规定(FIPS 151-2)里要求的。我们在本书里讨论的系统都遵守XSI(X/Open System Interface, X/Open系统接口)规范,并且执行文件的所有权规则。

3.7.3 unlink、link和symlink系统调用

你可以使用unlink系统调用来删除一个文件。

unlink系统调用删除一个文件的目录项并减少它的链接数。它在成功时返回0,失败时返回-1。如果想通过调用这个函数来成功删除文件,你就必须拥有该文件所属目录的写和执行权限。

如果一个文件的链接数减少到零,并且没有进程打开它,这个文件就会被删除。事实上,目录项总是被立刻删除,但文件所占用的空间要等到最后一个进程(如果有的话)关闭它之后才会被系统回收。rm程序使用的就是这个调用。文件上其他的链接表示这个文件还有其他名字,这通常是由ln程序创建的。你可以使用link系统调用在程序中创建一个文件的新链接。


先用open创建一个文件,然后对其调用unlink是某些程序员用来创建临时文件的技巧。这些文件只有在被打开的时候才能被程序使用,当程序退出并且文件关闭的时候它们就会被自动删除掉。


link系统调用将创建一个指向已有文件path1的新链接。新目录项由path2给出。你可以通过symlink系统调用以类似的方式创建符号链接。注意,一个文件的符号链接并不会增加该文件的链接数,所以它不会像普通(硬)链接那样防止文件被删除。

3.7.4 mkdir和rmdir系统调用

你可以使用mkdir和rmdir系统调用来建立和删除目录。

mkdir系统调用用于创建目录,它相当于mkdir程序。mkdir调用将参数path作为新建目录的名字。目录的权限由参数mode设定,其含义将按open系统调用的O_CREAT选项中的有关定义设置。当然,它还要服从umask的设置情况。

rmdir系统调用用于删除目录,但只有在目录为空时才行。rmdir程序就是用这个系统调用来完成工作的。

3.7.5 chdir系统调用和getcwd函数

程序可以像用户在文件系统里那样来浏览目录。就像你在shell里使用cd命令来切换目录一样,程序使用的是chdir系统调用。

程序可以通过调用getcwd函数来确定自己的当前工作目录。

getcwd函数把当前目录的名字写到给定的缓冲区buf里。如果目录名的长度超出了参数size给出的缓冲区长度(一个ERANGE错误),它就返回NULL。如果成功,它返回指针buf。


如果在程序运行过程中,目录被删除(EINVAL错误)或者有关权限发生了变化(EACCESS错误), getcwd也可能会返回NULL。