Bootstrap

Linux | 系统调用

Linux | 系统调用

前言:在Linux系统中,系统调用是用户空间程序与内核进行交互的桥梁,用户程序通过系统调用请求内核提供的服务。下面将详细介绍open系统调用以及其他常用的系统调用。

以下是 Linux 中几类核心系统调用:

类别系统调用示例功能描述
文件操作open, read, write, close打开/读/写/关闭文件
进程控制fork, execve, waitpid, exit创建进程、加载程序、等待子进程退出
内存管理brk, mmap, munmap调整堆内存、内存映射
网络通信socket, bind, connect, send创建套接字、绑定端口、连接远程主机、发送数据
设备控制ioctl控制硬件设备(如调整终端参数)
权限管理chmod, setuid修改文件权限、切换用户身份

下面主要讲解open系统调用和一些常用的系统调用

open 系统调用

功能

open 系统调用用于打开或创建一个文件、设备等,返回一个文件描述符(非负整数),后续对该文件的操作都可以通过这个文件描述符来进行。

头文件和函数原型
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数解释
  • pathname:要打开或创建的文件的路径名,可以是绝对路径或相对路径。
  • flags:用于指定文件的打开方式和行为,常用的标志有:
    • O_RDONLY:以只读方式打开文件。
    • O_WRONLY:以只写方式打开文件。
    • O_RDWR:以读写方式打开文件。
    • O_CREAT:如果文件不存在,则创建该文件。使用此标志时,需要第三个参数 mode 来指定新文件的权限。
    • O_TRUNC:如果文件已经存在且以写方式打开,则将文件长度截断为0。
    • O_APPEND:以追加方式打开文件,每次写操作都将数据追加到文件末尾。
  • mode:当使用 O_CREAT 标志创建新文件时,mode 参数指定新文件的权限。权限值通常使用八进制表示,例如 0644 表示文件所有者有读写权限,其他用户有读权限。
返回值
  • 成功时返回一个新的文件描述符(通常是当前可用的最小非负整数)。
  • 失败时返回 -1,并设置 errno 变量来指示具体的错误原因。
示例代码
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    printf("File opened successfully. File descriptor: %d\n", fd);
    close(fd);
    return 0;
}

其他常用系统调用

read 系统调用
  • 功能:从文件描述符指定的文件中读取数据到缓冲区。
  • 头文件和函数原型
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
  • 参数解释
    • fd:要读取数据的文件描述符。
    • buf:用于存储读取数据的缓冲区。
    • count:要读取的最大字节数。
  • 返回值
    • 成功时返回实际读取的字节数,可能小于 count
    • 到达文件末尾时返回 0。
    • 失败时返回 -1,并设置 errno
write 系统调用
  • 功能:将缓冲区中的数据写入到文件描述符指定的文件中。
  • 头文件和函数原型
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
  • 参数解释
    • fd:要写入数据的文件描述符。
    • buf:包含要写入数据的缓冲区。
    • count:要写入的字节数。
  • 返回值
    • 成功时返回实际写入的字节数,可能小于 count
    • 失败时返回 -1,并设置 errno
close 系统调用
  • 功能:关闭指定的文件描述符,释放相关资源。
  • 头文件和函数原型
#include <unistd.h>

int close(int fd);
  • 参数解释
    • fd:要关闭的文件描述符。
  • 返回值
    • 成功时返回 0。
    • 失败时返回 -1,并设置 errno
lseek 系统调用
  • 功能:用于改变文件的当前读写位置。
  • 头文件和函数原型
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
  • 参数解释
    • fd:要操作的文件描述符。
    • offset:偏移量,可正可负。
    • whence:指定偏移量的起始位置,常用的值有:
      • SEEK_SET:从文件开头开始计算偏移量。
      • SEEK_CUR:从文件当前位置开始计算偏移量。
      • SEEK_END:从文件末尾开始计算偏移量。
  • 返回值
    • 成功时返回新的文件偏移量。
    • 失败时返回 -1,并设置 errno
stat 系统调用
  • 功能:获取文件的状态信息,如文件大小、权限、创建时间等。
  • 头文件和函数原型
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);
  • 参数解释

    • pathname:要获取状态信息的文件路径名。
    • statbuf:指向 struct stat 结构体的指针,用于存储文件的状态信息。
  • 返回值

    • 成功时返回 0。
    • 失败时返回 -1,并设置 errno
;