文章目录
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
。