linux-系统函数

Linux 系统函数详解

Linux 系统函数是用户程序与内核交互的底层接口,通过系统调用(syscall)实现。以下是核心分类及典型函数:

1. 文件操作函数
c 复制代码
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode); // 打开文件
ssize_t read(int fd, void *buf, size_t count);          // 读取文件
ssize_t write(int fd, const void *buf, size_t count);  // 写入文件
int close(int fd);                                     // 关闭文件
  • 示例 :复制文件内容

    c 复制代码
    int src = open("a.txt", O_RDONLY);
    int dst = open("b.txt", O_WRONLY | O_CREAT, 0644);
    char buf[1024];
    ssize_t bytes = read(src, buf, sizeof(buf));
    write(dst, buf, bytes);
    close(src); close(dst);
2. 进程控制函数
c 复制代码
#include <unistd.h>
pid_t fork(void);                   // 创建子进程
int execve(const char *pathname, char *const argv[], char *const envp[]); // 执行程序
pid_t waitpid(pid_t pid, int *status, int options); // 等待进程结束
  • 进程创建流程

    c 复制代码
    pid_t pid = fork();
    if (pid == 0) { 
        execl("/bin/ls", "ls", "-l", NULL);  // 子进程执行命令
    } else {
        waitpid(pid, NULL, 0);  // 父进程等待
    }
3. 进程间通信(IPC)
  • 管道

    c 复制代码
    int pipe(int pipefd[2]);  // 创建管道
    // pipefd[0]读端, pipefd[1]写端
  • 共享内存

    c 复制代码
    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
4. 内存管理函数
c 复制代码
void *malloc(size_t size);     // 动态内存分配
void free(void *ptr);          // 释放内存
int brk(void *addr);           // 调整堆内存边界
void *sbrk(intptr_t increment);
5. 信号处理函数
c 复制代码
#include <signal.h>
int kill(pid_t pid, int sig);          // 发送信号
sighandler_t signal(int signum, sighandler_t handler); // 注册信号处理器
  • 常用信号
    • SIGINT (Ctrl+C)
    • SIGKILL (强制终止)
    • SIGSEGV (段错误)
6. 网络通信函数
c 复制代码
#include <sys/socket.h>
int socket(int domain, int type, int protocol);  // 创建套接字
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); // 绑定地址
int listen(int sockfd, int backlog);             // 监听连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 接受连接
7. 系统信息函数
c 复制代码
#include <unistd.h>
long sysconf(int name);  // 获取系统配置值
// 示例:获取页大小
long page_size = sysconf(_SC_PAGESIZE);

关键特性

  1. 直接内核交互

    系统调用通过软中断(如 int 0x80syscall 指令)触发内核模式切换。

  2. 错误处理

    失败时返回 -1 并设置 errno

    c 复制代码
    if (open("file", O_RDONLY) == -1) {
        perror("open failed");  // 输出"open failed: No such file or directory"
    }
  3. 性能影响

    上下文切换开销较高,需避免频繁调用(如批量读写替代单字节操作)。

开发建议

  1. 使用 man 2 <函数名> 查看手册(如 man 2 open
  2. 优先使用标准库封装(如 fopen 替代 open)以提升可移植性
  3. 多线程环境下需注意函数可重入性(如用 _r 后缀的线程安全版本)

通过 strace 命令可追踪进程的系统调用:

bash 复制代码
strace -e trace=open,read ./my_program

完整函数列表详见 Linux 内核文档或 syscalls(2) 手册页。

相关推荐
cqsztech2 小时前
基于ORACLE LINUX 10.1 MYSQL 8.4 源码安装
linux·mysql·oracle
Lugas Luo2 小时前
利用 Claude 辅助 Linux 嵌入式开发的高阶工作流Top Steps
linux
the sun342 小时前
我的第一个字符驱动:基于Linux2.4之前版本的古法编程
linux·驱动开发
XDHCOM2 小时前
DevOps是开发与运维的协作融合,并非简单取代,科普其核心价值与实践意义
运维·devops
拾贰_C2 小时前
【Ubuntu | Nvidia | installition0】Ubuntu安装Nvidia驱动
linux·运维·ubuntu
回到原点的码农2 小时前
Failed to restart nginx.service Unit nginx.service not found
运维·nginx
零K沁雪2 小时前
内核定时器
linux·内核
上天_去_做颗惺星 EVE_BLUE2 小时前
Linux Core Dump 测试操作手册
linux·c++·测试工具
国冶机电安装2 小时前
监控与安防系统安装:从方案设计到落地运维的一站式技术指南
运维