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

头文件和函数原型
c 复制代码
#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 变量来指示具体的错误原因。
示例代码
c 复制代码
#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 系统调用
  • 功能:从文件描述符指定的文件中读取数据到缓冲区。
  • 头文件和函数原型:
c 复制代码
#include <unistd.h>

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

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

int close(int fd);
  • 参数解释 :
    • fd:要关闭的文件描述符。
  • 返回值 :
    • 成功时返回 0。
    • 失败时返回 -1,并设置 errno。
lseek 系统调用
  • 功能:用于改变文件的当前读写位置。
  • 头文件和函数原型:
c 复制代码
#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 系统调用
  • 功能:获取文件的状态信息,如文件大小、权限、创建时间等。
  • 头文件和函数原型:
c 复制代码
#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。
相关推荐
Android系统攻城狮17 分钟前
Linux FFmpeg深度解析之avcodec_flush_buffers调用流程与实战(十九)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频进阶
水饺编程1 小时前
第2章:Linux 基础,解压缩【.tar.bz2】压缩包文件
linux·c语言·汇编
Y3815326622 小时前
用 httpx 写 SerpBase 异步客户端:连接池与超时配置
运维·服务器·数据库
Zevalin爱灰灰2 小时前
Linux入门第二部分(ARM裸机篇) 第二章 Cortex-A7 MPCore架构与ARM汇编基础
linux·汇编·arm开发·嵌入式
倔强的石头1062 小时前
【Linux指南】进程通信系列(七):System V 信号量 —— 同步互斥的内核原语
linux·运维·服务器
GeW2 小时前
从"补短板"到"强优势"Linux与数据库认证成为产业跃迁人才支点
linux·数据库
HZZD_HZZD3 小时前
大口径摄像水表白皮书拆解:DN40加装改造与字轮识别实测
运维·物联网·腾讯云
PellyKoo4 小时前
【Ubuntu】GTX 1080 Ti 显卡占用为0但功率高达60W的排查与解决
linux·运维·ubuntu
Fruiticecake5 小时前
epoll 回显服务器是怎么工作的:从 accept 队列到就绪链表,以及它和 select / poll 的区别
linux
莫晓燚5 小时前
阿里云若依项目部署与日志采集---实战
运维·数据库·redis·阿里云·ruoyi