linux 系统编程概述
系统编程三大基石:系统调用,C库,C编译器
1.系统调用:从操作系统中获得符合或者资源,又用户空间向内核发起的函数调用,如 read , write 等系统调用函数
2.C库:Linux 应用程序的核心,glibc ,系统调用封装,线程支持, 基本应用工具
3.C编译器: gcc 。编译器辅助实现了C标准和系统的ABI。
API 和 ABI
API:应用程序接口,软件模块之间再源代码层交互的接口。提供标准接口的方式进行封装,
ABI:应用程序二进制接口,特定的架构上两个或者多个软件模块之间的二进制接口。ABI保证二进制代码兼容。
标准:POSIX 和 SUS
文件和文件系统:
文件:文件必须被打开才能访问,每个进程打开的每个文件都有唯一的文件描述符--一个整数表示,简写为fd,在用户空间中共享。
普通文件:线性字节数组方式组织的数据,字节流。
文件长度:文件大小的字节计数,组成文件的线性数组里字节的数目。
inode节点:文件系统在磁盘上实际物理对象,也是内核中的数据结构的概念实体
链接:文件名和inode 节点的配对。映射在物理磁盘上的形式不限,可以是表格,哈希表。
映射由内核代码对某一个特定文件系统实现和管理。
硬链接:不同文件名映射到同一个inode 节点的多个链接,允许多个路径名指向相同的数据。
符号链接(软链接):为了跨越文件系统。 看上去向普通文件,可以指向任何地方。需要更多开销。缺少透明性。
特殊文件:块设备,字符设备,命名管道(FIFO),Unix域套接字。
文件系统:合法层次结构组织的文件和目录的集合。
挂载:文件系统从全局的文件和目录的名字空间独立的添加
卸载:文件系统从全局的文件和目录的名字空间独立的移除
挂载点:文件系统中要挂载在名字空间中特定的位置。
Linux支持内存的虚拟文件系统,NFS,媒体文件系统,原生文件系统(ext3),XFS,FAT
进程:执行中的目标代码:生存的程序,以及数据、资源、状态等变量,由内核仲裁和管理的系统资源管理,计时器,挂起信号量,打开文件,网络连接,硬件,IPC。存储在进程描述符中
支持抢占式多任务和虚拟内存。
线程:进程中的活动单位,负责执行代码和维护进程的运行状态。linux程序被单线程化。
包括栈,处理器状态,目标代码当前位置。
Linux独特的线程视图:偶然共享某些资源的进程。
进程体系:每个进程都有唯一的正整数表示,即ID,第一个进程是1.
进程终止之后,不会立即从系统中移除,内核将在内存中保存进程的部分内容,允许父进程查看该进程的状态-------进程等待。
用户和组:用户和组认证。每个用户和唯一的正整数关联--用户ID。
每个进程域一个用户ID关联,用来识别这个进程的用户,称为进程的真是uid。
文件权限:文件的所有者,所属组,权限位集。分别对应uid,gid,other 对文件的读,写,执行的权限。
文件所有者和权限信息存储在文件的inode中
信号:单向异步通知机制。一般用于通知进程发生某些事件。
进程间通信:IPC,管道,命名管道,信号量,消息队列,共享内存,快速用户空间互斥体(Futuxes)
头文件:大量的头文件。
错误处理:错误通常通过函数的返回值表示,并通过特殊的变量errno来描述。
错误值告诉调用函数发生了错误,但不提供错误的原因,errno变量用于定位错误的原因。
#include<errno.h>
extern int errno;
将 errno 的值转换到对应的文本,这些函数仅在错误报告的时候有必要。 perror();
#include <stdio.h>
void perror(const char *str); 向stderr 打印出以str 指向的字符串为前缀,
char *strerror(int errnum);
int strerror_r(int errnum, char *buf, size_t len); 线程安全的。
使用errno 编程时,忽视了 库函数和系统调用都可以修改errno 的值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)