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

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

Luminol Chen
Luminol Chen
2024 Undergraduate in Cyberspace Security

My research interests include cryptography and blochchain.