当前位置: 首页 > article >正文

Linux系统调用深度剖析

Linux系统调用深度剖析与实践案例

目录

Linux系统调用深度剖析与实践案例

一、Linux系统调用概述

二、进程管理相关系统调用

1. fork():进程克隆与多任务处理

2. exec系列:程序加载与替换

3. wait/waitpid:进程状态同步

三、文件操作相关系统调用

1. 文件描述符操作(open/read/write)

2. 文件描述符重定向(dup/dup2)

四、系统资源监控调用

1. getrusage:获取资源使用统计

2. sysinfo:系统全局信息获取

五、高级系统调用应用

1. 进程线程管理(clone)

2. 内存管理(mmap/munmap)

六、Python调用Linux系统调用

1. 使用ctypes调用共享库

2. 使用cffi绑定C头文件

七、系统调用性能优化

1. 缓存系统调用结果

2. 减少系统调用次数

八、系统调用安全实践

1. 权限检查与错误处理

2. 使用chroot限制执行环境

九、系统调用调试技巧

1. strace工具使用

2. 内核日志分析(dmesg)

十、系统调用的现代演进

1. eBPF技术应用

2. SystemTap动态追踪

十一、典型应用场景

1. 实现简单的Shell

2. 实现进程监控器

十二、系统调用性能测试

1. 微基准测试

2. 系统调用开销对比

十三、系统调用的未来方向

十四、总结与建议

一、Linux系统调用概述

Linux系统调用是操作系统内核与用户空间程序之间的接口,是用户程序访问硬件资源和内核服务的唯一合法途径。系统调用通过中断机制(如int 0x80sysenter指令)将控制权从用户态切换到内核态,完成特定操作后返回结果。其核心价值体现在:

  1. 安全性:通过特权级切换(Ring3→Ring0)确保内核资源受保护
  2. 统一性:为所有应用程序提供标准化的接口规范
  3. 灵活性:支持进程管理、文件操作、网络通信等200+系统调用
  4. 高效性:内核直接处理请求,避免不必要的上下文切换

二、进程管理相关系统调用

1. fork():进程克隆与多任务处理

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid < 0) {perror("Fork failed");return 1;} else if (pid == 0) {// 子进程printf("Child process PID: %d\n", getpid());execl("/bin/ls", "ls", "-l", NULL);perror("Exec failed"); // 如果execl失败才执行} else {// 父进程int status;wait(&status); // 等待子进程结束if (WIFEXITED(status)) {printf("Child exited with status: %d\n", WEXITSTATUS(status));}}return 0;
}

代码解析

  • fork()返回值语义:
    • <0:创建失败
    • =0:子进程视角
    • >0:父进程视角(返回子进程PID)
  • 写时复制(Copy-on-Write)机制:父子进程共享物理内存页,仅在修改时复制
  • execl()执行新程序时,当前进程映像被替换,参数传递需遵循NULL结尾的惯例

应用案例

  1. 并发服务器:通过fork()创建子进程处理客户端连接
  2. 批处理作业:并行执行多个计算任务
  3. Shell命令管道:创建多个子进程形成处理流水线

2. exec系列:程序加载与替换

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[]) {if (argc < 2) {fprintf(stderr, "Usage: %s <command>\n", argv[0]);return 1;}char *args[] = {"/bin/sh", "-c", argv[1], NULL};execv(args[0], args);// 如果execv返回,说明执行失败perror("execv failed");return 1;
}

关键点

  • execv()参数传递方式:char *const argv[]
  • execve()支持环境变量传递
  • 执行失败时返回原进程上下文,需配合perror()进行错误诊断

3. wait/waitpid:进程状态同步

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pids[5];for (int i = 0; i < 5; i++) {pids[i] = fork();if (pids[i] == 0) {sleep(1); // 模拟工作负载exit(i);}}for (int i = 0; i < 5; i++) {int status;pid_t child = waitpid(-1, &status, 0);if (WIFEXITED(status)) {printf("Child %d exited with code %d\n", child, WEXITSTATUS(status));}}return 0;
}

实现要点

  • waitpid(-1, ...)等待任意子进程
  • WNOHANG标志实现非阻塞等待
  • 僵尸进程处理:未被回收的退出进程会成为僵尸

三、文件操作相关系统调用

1. 文件描述符操作(open/read/write)

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main() {int fd = open("test.txt", O_CREAT|O_WRONLY|O_TRUNC, 0644);if (fd == -1) {perror("open");return 1;}const char *data = "Hello, system call!";ssize_t bytes = write(fd, data, strlen(data));if (bytes == -1) {perror("write");close(fd);return 1;}lseek(fd, 0, SEEK_SET); // 将文件指针移回开头char buffer[100];bytes = read(fd, buffer, sizeof(buffer)-1);if (bytes == -1) {perror("read");} else {buffer[bytes] = '\0';printf("Read data: %s\n", buffer);}close(fd);return 0;
}

关键参数

  • O_CREAT:文件不存在则创建
  • O_APPEND:追加写入模式
  • O_NONBLOCK:非阻塞IO标志

2. 文件描述符重定向(dup/dup2)

#include <unistd.h>
#include <stdio.h>int main() {// 备份标准输出int stdout_copy = dup(STDOUT_FILENO);// 打开文件并重定向标准输出int fd = open("output.txt", O_CREAT|O_WRONLY|O_TRUNC, 0644);dup2(fd, STDOUT_FILENO);close(fd);printf("This will be written to output.txt\n");// 恢复标准输出dup2(stdout_copy, STDOUT_FILENO);close(stdout_copy);printf("This will be printed to console\n");return 0;
}

应用场景

  • Shell脚本输出重定向
  • 日志记录器实现
  • 安全审计(记录所有输出)

相关文章:

Linux系统调用深度剖析

Linux系统调用深度剖析与实践案例 目录 Linux系统调用深度剖析与实践案例 一、Linux系统调用概述 二、进程管理相关系统调用 1. fork():进程克隆与多任务处理 2. exec系列:程序加载与替换 3. wait/waitpid:进程状态同步 三、文件操作相关系统调用 1. 文件描述符操作…...

动态规划-918.环形子数组的最大和-力扣(LeetCode)

一、题目解析 听着有点复杂&#xff0c;这里一图流。 将环形问题转化为线性问题。 二、算法原理 1.状态表示 2.状态转移方程 详细可以移步另一篇博客&#xff0c;53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 3.初始化 由于计算中需要用到f[i-1]和g[i-1]的值&…...

Docker 镜像标签(Tag)规范与要求

Docker 镜像标签(Tag)规范与要求 背景 目前主流云厂商&#xff0c;如阿里云、百度云和腾讯云&#xff0c;均提供租户使用的镜像仓库服务。 各个厂商要求可能不太一样&#xff0c;比如华为&#xff1a;https://doc.hcs.huawei.com/zh-cn/usermanual/swr/swr_faq_0017.html 样…...

STM32:Modbus通信协议核心解析:关键通信技术

知识点1【 Modbus通信】 1、Modbus的概述 Modbus是OSI模型第七层的应用层报文传输协议 协议&#xff1a;说明有组包和解包的过程 2、通信机制 Modelbus是一个请求/应答协议 通信机制&#xff1a;主机轮询&#xff0c;从机应答的机制。每个从设备有唯一的地址&#xff0c;主…...

线程封装与互斥

目录 线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量有两种方法&#xff1a; 销毁互斥量 互斥量加锁和解锁 改进售票系统 互斥量实现原理探究 互斥量的封装 线程互斥 进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共…...

鸿蒙OSUniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践#三方框架 #Uniapp

使用 UniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践 在移动互联网时代&#xff0c;天气应用几乎是每个人手机中的"标配"。无论是出行、旅游还是日常生活&#xff0c;实时获取天气信息都极为重要。本文将以"实时天气查询应用"为例&#xff0c;详…...

第十一天 5G切片技术在车联网中的应用

前言 在自动驾驶汽车每天产生4TB数据的时代&#xff0c;传统的移动网络已难以满足车联网的海量连接需求。中国移动2023年实测数据显示&#xff0c;某智能网联汽车示范区在传统5G网络下&#xff0c;紧急制动指令的传输延迟高达65ms&#xff0c;而5G网络切片技术将这个数值降低到…...

Spring AI 系列之一个很棒的 Spring AI 功能——Advisors

1. 概述 由AI驱动的应用程序已成为我们的现实。我们正在广泛地实现各种RAG应用程序、提示API&#xff0c;并利用大型语言模型&#xff08;LLM&#xff09;创建项目。借助 Spring AI&#xff0c;我们可以更快速地完成这些任务。 在本文中&#xff0c;我们将介绍一个非常有价值…...

Vue3 + TypeScript + el-input 实现人民币金额的输入和显示

输入人民币金额的参数要求&#xff1a; 输入要求&#xff1a; 通过键盘&#xff0c;只允许输入负号、小数点、数字、退格键、删除键、方向左键、方向右键、Home键、End键、Tab键&#xff1b;负号只能在开头&#xff1b;只保留第一个小数点&#xff1b;替换全角输入的小数点&a…...

2.1 C++之条件语句

学习目标&#xff1a; 理解程序的分支逻辑&#xff08;根据不同条件执行不同代码&#xff09;。掌握 if-else 和 switch 语句的用法。能编写简单的条件判断程序&#xff08;如成绩评级、游戏选项等&#xff09;。 1 条件语句的基本概念 什么是条件语句&#xff1f; 程序在执…...

ZYNQ实战:可编程差分晶振Si570的配置与动态频率切换

为什么需要可编程差分晶振? 在现代FPGA和嵌入式系统中,高速串行通信(如GTP/GTX收发器)对参考时钟的精度和灵活性要求极高。例如,1G以太网需要125MHz时钟,SATA协议需120MHz,而DisplayPort则需135MHz。传统固定频率晶振无法满足多协议动态切换需求,而Si570凭借其10MHz~8…...

Linux `ls` 命令深度解析与高阶应用指南

Linux `ls` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似命令对比二、选项系统详解1. 常用基础选项2. 进阶筛选选项三、高阶应用技巧1. 组合过滤查询2. 格式化输出控制3. 元数据深度分析四、企业级应用场景1. 存储空间监控2. 安全审计3. 自动化运维五、特…...

【MPC控制 - 从ACC到自动驾驶】5. 融会贯通:MPC在ACC中的优势总结与知识体系构建

【MPC控制 - 从ACC到自动驾驶】融会贯通&#xff1a;MPC在ACC中的优势总结与知识体系构建 在过去的四天里&#xff0c;我们一起经历了一段奇妙的旅程&#xff1a; Day 1: 我们认识了自适应巡航ACC这位“智能领航员”&#xff0c;并初见了模型预测控制MPC这位“深谋远虑的棋手…...

Day3 记忆内容:map set 高频操作

以下是 第三天 的详细学习内容&#xff0c;聚焦 map和set的高效应用&#xff0c;重点突破查找类题型和去重逻辑&#xff0c;助你提升代码效率&#xff01; &#x1f4da; Day3 记忆内容&#xff1a;map & set 高频操作 1. map 核心操作&#xff08;手写3遍&#xff09; /…...

初等数论--Garner‘s 算法

0. 介绍 主要通过混合积的表示来逐步求得同余方程的解。 对于同余方程 { x ≡ v 0 ( m o d m 0 ) x ≡ v 1 ( m o d m 1 ) ⋯ x ≡ v k − 1 ( m o d m k − 1 ) \begin{equation*} \begin{cases} x \equiv v_0 \quad (\ \bmod \ m_0)\\ x \equiv v_1 \quad (\ \bmod \ m_1)…...

NV211NV212美光科技颗粒NV219NV220

NV211NV212美光科技颗粒NV219NV220 技术架构解析&#xff1a;从颗粒到存储系统 近期美光科技发布的NV211、NV212、NV219、NV220系列固态颗粒&#xff0c;凭借其技术突破引发行业关注。这些颗粒基于176层QLC堆叠工艺&#xff0c;单Die容量预计在2026年可达1Tb&#xff0c;相当…...

SQL解析工具JSQLParser

目录 一、引言二、JSQLParser常见类2.1 Class Diagram2.2 Statement2.3 Expression2.4 Select2.5 Update2.6 Delete2.7 Insert2.8 PlainSelect2.9 SetOperationList2.10 ParenthesedSelect2.11 FromItem2.12 Table2.13 ParenthesedFromItem2.14 SelectItem2.15 BinaryExpressio…...

Wave Terminal + Cpolar:SSH远程访问的跨平台实战+内网穿透配置全解析

文章目录 前言1. Wave Terminal安装2. 简单使用演示3. 连接本地Linux服务器3.1 Ubuntu系统安装ssh服务3.2 远程ssh连接Ubuntu 4. 安装内网穿透工具4.1 创建公网地址4.2 使用公网地址远程ssh连接 5. 配置固定公网地址 前言 各位开发者朋友&#xff0c;今天为您介绍一款颠覆性操…...

html使用JS实现账号密码登录的简单案例

目录 案例需求 思路 错误案例及问题 修改思路 案例提供 所需要的组件 <input>标签&#xff0c;<button>标签&#xff0c;<script>标签 详情使用参考&#xff1a;HTML 教程 | 菜鸟教程 案例需求 编写一个程序&#xff0c;最多允许用户尝试登录 3 次。…...

sorted() 函数和sort()函数的区别

在Python中&#xff0c;sorted() 函数和列表的 sort() 方法都用于排序&#xff0c;但它们之间有一些关键的区别&#xff1a; 返回值&#xff1a; sorted()&#xff1a;返回一个新的列表&#xff0c;包含所有排序后的元素&#xff0c;原始列表不会被修改。sort()&#xff1a;对列…...

Solr搜索:比传统数据库强在哪?

Solr 是一个基于 Apache Lucene 的开源搜索平台&#xff0c;广泛用于全文检索和数据分析。与传统的关系型数据库查询相比&#xff0c;Solr 在某些方面具有明显的优势&#xff0c;特别是在处理大规模文本数据和复杂的搜索需求时。以下是 Solr 相对于传统数据库查询的主要优势&am…...

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

目录 数据概述一、输入数据与处理二、融合算法1. ESTARFM(Enhanced STARFM)2. ubESTARFM(Unbiased ESTARFM)代码实现数据下载参考根据论文《Generating daily 100 m resolution land surface temperature estimates continentally using an unbiased spatiotemporal fusion…...

51c自动驾驶~合集55

我自己的原文哦~ https://blog.51cto.com/whaosoft/13935858 #Challenger 端到端碰撞率暴增&#xff01;清华&吉利,框架&#xff1a;低成本自动生成复杂对抗性驾驶场景~ 自动驾驶系统在对抗性场景&#xff08;Adversarial Scenarios&#xff09;中的可靠性是安全落…...

【前端基础】Promise 详解

文章目录 什么是 Promise&#xff1f;为什么要使用 Promise&#xff1f;创建 Promise消费 Promise (使用 Promise)1. .then(onFulfilled, onRejected)2. .catch(onRejected)3. .finally(onFinally) Promise 链 (Promise Chaining)Promise 的静态方法1. Promise.resolve(value)2…...

高性能管线式HTTP请求

高性能管线式HTTP请求:原理、实现与实践 目录 高性能管线式HTTP请求:原理、实现与实践 1. HTTP管线化的原理与优势 1.1 HTTP管线化的基本概念 关键特性: 1.2 管线化的优势 1.3 管线化的挑战 2. 高性能管线式HTTP请求的实现方案 2.1 技术选型与工具 2.2 Java实现:…...

c/c++的opencv膨胀

使用 OpenCV (C) 进行图像膨胀操作详解 图像膨胀 (Dilation) 是形态学图像处理中的另一种基本操作&#xff0c;与腐蚀操作相对应。它通常用于填充图像中的小孔洞、连接断开的物体部分、以及加粗二值图像中的物体。本文将详细介绍膨胀的原理&#xff0c;并演示如何使用 C 和 Op…...

react native搭建项目

React Native 项目搭建指南 React Native 是一个使用 JavaScript 和 React 构建跨平台移动应用的框架。以下是搭建 React Native 项目的详细步骤&#xff1a; 1. 环境准备 安装 Node.js 下载并安装 Node.js (推荐 LTS 版本) 安装 Java Development Kit (JDK) 对于 Androi…...

【CSS】九宫格布局

CSS Grid布局&#xff08;推荐&#xff09; 实现代码&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

Python用Transformer、Prophet、RNN、LSTM、SARIMAX时间序列预测分析用电量、销售、交通事故数据

原文链接&#xff1a; tecdat.cn/?p42219 在数据驱动决策的时代&#xff0c;时间序列预测作为揭示数据时序规律的核心技术&#xff0c;已成为各行业解决预测需求的关键工具。从能源消耗趋势分析到公共安全事件预测&#xff0c;不同领域的数据特征对预测模型的适应性提出了差异…...

java基础(面向对象进阶高级)泛型(API一)

认识泛型 泛型就等于一个标签(比如男厕所和女厕) 泛型类 只能加字符串&#xff1a; 把别人写好的东西&#xff0c;自己封装。 泛型接口 泛型方法、泛型通配符、上下限 怎么解决下面的问题&#xff1f; API object类 toString: equals: objects类 包装类 为什么上面的Integer爆红…...