Linux System Calls - File System
Linux文件系统相关系统调用

请解释以下系统调用的详细含义。
open
,close
,read
,write
,lseek
,link
,mount
1 - open
open
系统调用可以打开一个文件,其函数原型为:
int open(const char *pathname, int flags, mode_t mode);
其中,pathname
表示要打开文件的路径,flags
表示访问模式,mode
表示文件权限掩码,只能在文件创建时生效(i.e. flags==O_CREAT
),返回值是一个文件描述符(file descriptor)。
其中,flags
必须包含访问模式,包括:
- 只读模式:
O_RDONLY
- 只写模式:
O_WRONLY
- 读写模式:
O_RDWR
除此之外的flags
可以通过按位或的方式同时启用,包括:
O_APPEND
:增加模式:文件偏移量置于文件末尾;O_CREAT
:创建模式:当pathname
不存在,生成文件;O_TRUNC
:截断模式:当文件可写,则抛弃原来内容。
例如,我们需要创建一个只写模式的文件1.txt
,权限为rwxrwxrwx
,可使用:
int fd = open("1.txt", O_WRONLY | O_CREAT, 0777);
2 - close
close
系统调用可以关闭一个文件,其函数原型为:
int close(int fd);
其中,fd
表示要关闭的文件描述符(如open
系统调用的返回值)。
返回值为0
时,表示关闭成功,为-1
时,表示系统错误,
且同时errno
会被设置用于指示错误类型信息。
3 - read
read
系统调用可以从一个文件描述符读数据,其函数原型为:
ssize_t read(int fd, void *buf, size_t count);
其中,fd
表示要读取的文件描述符(同上),buf
是指向读取存放空间的首地址,
count
是要读取字节数。成功读取时,返回读取的字节数*,反之返回-1
,表示系统错误。
*需注意,返回值可能会小于count
值,该情况发生在读内容不足,遇到文件尾(End of File, EOF)时。
4 - write
write
系统调用可以向一个文件描述符写数据,其函数原型为:
ssize_t write(int fd, const void *buf, size_t count);
其中,fd
表示要写入的文件描述符(同上),buf
是指向存放空间的首地址,
count
是要写入字节数。成功读取时,返回写入的字节数*,反之返回-1
,表示系统错误。
*同样,需注意返回值可能会小于count
值,该情况发生在写空间不足时(空间有限,或设置了写入上限RLIMIT_FSIZE
,或被信号中断)。
5 - lseek
lseek
系统调用可以重定向读写文件的偏移量,其函数原型为:
off_t lseek(int fd, off_t offset, int whence);
其中,fd
表示要操作的文件描述符,offset
表示偏移量,whence
表示开始处标志(从何处开始)。当操作成功,返回结果偏移量,反之返回-1
表示错误。
其中whence
可取值为:
SEEK_SET
:文件偏移量设置为offset
字节;SEEK_CUR
:文件偏移量设置为当前偏移量加上offset
字节;SEEK_END
:文件偏移量设置为文件大小加上offset
字节*。
不难看出此处偏移量可以大于文件大小。当大于时,若继续调用write
,则文件中会出现一段空隙,该空隙会被填充为\0
。
6 - link
link
系统调用可以创建一个文件的硬链接,其函数原型为:
int link(const char *oldpath, const char *newpath);
其中,oldpath
表示被链接文件路径,newpath
表示链接文件路径。
返回值为0
则表示创建成功,为-1
时表示创建失败。
另需注意,当newpath
非空时,不会覆盖原有链接,并且返回-1
。
7 - mount
mount
系统调用挂载一个文件系统,其函数原型为:
int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);
其中:
source
表示被挂载的文件系统(硬件设备、文件目录等等);target
表示挂载路径;filesystemtype
表示被挂载的文件系统类型(btrfs, ext4, jfs等);mountflags
表示执行的操作;data
由不同的文件系统解释,通常是一串以逗号分隔的选项。
其中,mountflags
可取:
MS_REMOUNT
:对已有的挂载重挂载;MS_BIND
:创建绑定挂载;MS_SHARED, MS_PRIVATE, MS_SLAVE, MS_UNBINDABLE
:用于修改已有挂载的访问属性(propagation type);MS_MOVE
:将一个现有的挂载移动到另一处;- 为空时,创建新挂载。
Reference: Linux Man Pages