目录

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
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
sondx21 分钟前
mac安装浏览器闪退处理
运维·docker·容器
Liuzhengyue_37 分钟前
Linux shell脚本编程
linux·运维·服务器
babytiger1 小时前
在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后,在虚拟机中未能看到共享的内容
linux·运维·ubuntu
回眸&啤酒鸭2 小时前
【回眸】Linux 内核 (十六) 之 多线程编程 下
linux·物联网
李匠20242 小时前
C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件
运维·服务器·c++·学习
Wayne_Greet2 小时前
Linux服务器——Samba服务器
linux·运维·服务器
Y淑滢潇潇2 小时前
RHCSA Linux系统 数据流和重定向 tee 命令
linux·运维·云计算
栩栩云生2 小时前
📥 x-cmd install | ugm - 你的 UNIX 用户和组信息一览表,尽在终端!
linux·unix·命令行
知其_所以然2 小时前
docker安装软件汇总(持续更新)
运维·docker·容器
ydswin2 小时前
运维必备:基于 Harbor 的 Helm Charts 批量拉取,从配置到自动化脚本
linux