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 的值。

 

posted @   愿得入睡  阅读(352)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示