一、概述

本文详细介绍了Linux系统编程的关键概念,包括系统调用、文件系统、进程、线程、用户和组、信号以及进程间通信。系统调用是与内核交互的基础,文件系统涉及到普通文件、硬链接、软链接和特殊文件的管理。进程和线程是执行代码的载体,进程间通信则涉及多种机制,如管道、信号量等。文章还讨论了错误处理和用户权限的细节。
摘要由CSDN通过智能技术生成

一、系统编程

1、系统调用(syscalls):为了从操作系统获得服务或者资源而从用户空间向内核(系统核心)发起的函数调用。
2、调用系统调用:用户空间程序发送信号通知内核它希望调用一个系统调用。
3、API应用程序接口:软件模块之间在源代码层交互的接口
4、ABI应用程序二进制接口:在特定的架构上两个或者多个软件模块之间的二进制接口。

二、文件系统

1、普通文件:包含以线性字节数组方式组织的数据,通常称为字节流和字符流;文件访问通过文件名访问,但是每一个文件对应一个inode标志,一个inode存储文件关联的元数据(修改时间戳、所有者、类型、长度及文件数据地址),文件访问的时候依靠名字与inode配对,映射存在物理磁盘上可以是表格、哈希表。
2、硬链接:不同的名字映射同一个inode信息节点,每个inode包含一个inode链接计数来跟踪文件系统,当链接解除的时候链接计数减1,当他为0的时候文件才真正删除。
3、软连接(符号链接):类似于windows下的快捷方式,在一个文件中指向另外一个文件的inode号,如果被指向的文件被删除那么这个符号链接就无效被称为坏链接。
4、特殊文件:块设备文件、字符设备文件、命名管道和Unix域套接字四类特殊文件;一切皆文件。字符设备通过字符设备文件进行访问,按照字节线性队列写入队列例如键盘;块设备则是以字节数组的方式进行访问例如存储设备、硬盘、软盘等。命名管道是以文件描述符为信道的进程间通信机制。套接字是进程间通信的高级形式。
5、文件系统:存储在物理介质上,文件系统能从全局的文件和目录的名字空间独立的添加和移除。这些操作称为挂载和卸载,块设备的最小访问地址单元是扇区,扇区是设备的物理单位。扇区是2的指数倍,通常为512字节;而文件系统的最小逻辑单元是块,块通常是2的指数倍与扇区大小的乘积但是必须小于页的大小。

三、进程

1、进程:执行的目标代码:活动的、生存、运行的程序;还包含数据、资源、状态以及虚拟化计算机。从可执行目标代码(元数据、多个代码和数据段)开始其生命周期,段是加载到线性内存块的线性目标代码块。代码段包含可执行代码和只读数据;数据段包含已初始化数据;bass段包含为初始化的全局数据。
2、进程体系:每一个进程都有一个pid,第一个进程是1,进程有一个严格的层次结构就是进程树,以第一个进程(init)进程为根,除根外每个进程都有一个父进程如果父进程先与子进程终止,内核将init进程指定为它的父进程。
3、僵尸进程:进程终止不会立即从系统移除,内核将在内存中保存进程的部分内容,允许父进程查询该进程的终止状态一旦父进程确认了子进程的终止子进程就完全删除;如果进程终止而父进程未获得其状态那么就叫僵尸进程。init进程等待所有的子进程,保证他的子进程不会永久处于僵死状态。

四、线程

1、线程是进程中的活动单位,是一种抽象,它负责执行代码和维护进程的运行状态。线程包括栈(如进程栈)、处理器状态、目标代码的当前位置。进程剩下的部分由所有线程共享。

五、用户和组

1、每个用户与一个id关联那就是uid,用来识别运行这个进程的用户。当用户登录成功后将生成一个登录shell用户id作为进程的uid,子进程继承父进程的uid,用户名和uid在 /etc/passwd 文件中映射。uid 0是超级用户。除了真实UID,每个进程还有一个有效UID,一个保留UID和文件系统UID。真实UID是启动进程的用户,有效UID可以是进程在其他用户下运行,保留UID保存原来的有效UID,它的值决定了用户将切换哪个有效UID。
2、一个用户归属于一个或者多个组,包括/etc/passwd 下的基本组或登录组,也可能是/etc/group 中的其他附加组,每个进程有一个组id(gid);也有真实gid,有效gid,保留gid,文件系统gid。进程和用户等入组关联和其他附加组没有关系。

六、信号

1、信号是一种单向异步通知机制如Ctrl + C等。。。

七、进程间通讯

Linux支持的进程间通讯包括管道、命名管道、信号量、消息队列、共享内存和快速用户空间互斥体。

八、错误处理

错误通常通过函数返回值表示并通过errno来描述。errno通常在函数显示错误后(通常返回-1)短时间有效;并且errno的值可以被读写。

这里写图片描述

void perror(const char *str); //将errno的值转换为对应的文本。
char *strerror(int errnum); //返回errnum值描述的字符串指针。
char strerror_r(int errnum, char *buf, size_t len); //这个是线程安全的,它向buf指向的长度为len的缓冲区写入数据,函数失败时返回-1设置errno
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值