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 0x80 或 syscall 指令)触发内核模式切换。

  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) 手册页。

相关推荐
java_logo3 小时前
Docker 部署 Portainer CE 中文版:轻松搭建容器管理平台
运维·docker·容器·portainer·容器管理·轩辕镜像·portainer ce
山东孙燕姿3 小时前
前端框架升级:不敢动的组件怎么办
大数据·运维·服务器·网络·人工智能·前端框架
古法老登瞎折腾11 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
琥珀.11 小时前
mysql中json数组转列表查询
linux·运维·服务器
dawnsky.liu12 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
Linux运维技术栈13 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
云上先途114 小时前
企业 AI 服务部署周期多久,会不会影响原有业务运转?
大数据·运维·人工智能
执伞人ONLY15 小时前
AI知识库自动化知识加工没做对,人工整理永远追不上知识产生
运维·人工智能·自动化
slongzhang_15 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
叼烟扛炮15 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节