最全面的Linux系统编程基础
一、Linux系统编程基础
1.程序执行环境
程序访问参数列表的方法:
- 主函数的参数argc和argv
- 程序接受命令行的输入参数,并解释之
命令行参数这一块自己并并不懂
1.1.环境变量
典型的Linux环境变量:
- USER:用户名
- HOME:主目录
- PATH:分号分割的Linux查找命令的目录列表
shell处理
- shell编程时查看环境变量:echo $USER
- 设置新的环境变量:EDITOR=emacs;export EDITOR或export EDITOR=emacs
使用getenv()函数返回环境变量的值
1.2.程序退出码
- 程序结束时传递给操作系统的整型数据
- 实际上是main()函数的返回值
- 其他函数也可以调用exit()函数返回特定退出码。常用exit(exit_code)
- 应该仔细设计退出码,确定他们能够区别程序执行状况。(0正确,-1错误,1,…等等,自定义)。退出码可以给后续程序,操作系统或者程序员使用
- shell编程时查看上一次退出码的命令:echo $?
1.3.系统调用错误处理
C程序使用断言,C++程序使用断言或异常处理机制(涉及类库的时候使用异常处理机制更好)
系统调用时两个问题
- 系统调用:访问系统资源的手段
- 系统调用失败原因:资源不足;因权限不足而被阻塞;使用参数无效,入无效的内存地址或文件描述符号;被外部事件中断;不可估计的外部原因
- 资源管理:已分配的资源必须在任何情况下都能正确释放
1.4.资源管理(非常重要的任务)
必须予以明确管理的资源类型
- 内存、文件描述符、文件指针、临时文件、同步对象等等
资源管理流程:
- 分配资源
- 正常处理流程
- 如果流程势失败,释放资源并退出,否这执行正常处理流程
- 释放资源(分配的内存、打开的文件)
- 函数返回
1.5.系统日志
日志:系统或程序运行的记录
系统日志进程:syslogd/rsyslogd
- 两者均为守护(deamon)进程,即运行在后台负责为所有用户进程服务,没有控制终端,也不会接受用户输入,父进程通常为init进程
- 日志文件一般为“/dev/log”,日志一般保存在“/var/log/”目录下
- rsyslogd既能接收用户进程输出的日志,也能接收内核日志;在接收到日志信息后,会输出到特定的日志文件中;日志信息的分发可配值。
日志打开函数日志的过滤和关闭
1.6.用户信息
用户信息
2.LInux的输入输出
2.1标准输入输入
通常标准输出流有缓冲,标准错误流无缓冲
2.2文件描述符号(写程序尽量不用)
目的和意义:在程序中代表文件
- 内核为每个进程维护一个文件打开记录表,文件描述符为该文件在表中的索引值。
文件描述符为非负整数,范围从0到OPEN_MAX
- 不同的操作系统可能具有不同范围,可以同时打开的文件数目不同。Linux所有的都是文件,都可以用文件描述符来表示
文件描述符号的缺点
- 非UNIX/Linux操作系统中可能没有文件描述符该联,跨品太编程时建议使用C/C++标准库函数和文件流类
2.3 I/O函数
2.4 临时文件
3.文件系统
3.1 实际文件系统:组成与功能描述
ext,ext2,ext3,ext4(现在在用ext4)
3.2 虚拟文件系统VFS
3.3 特殊文件系统/proc
从/proc文件系统中抽取信息
4.设备
4.1 设备
设备即文件(操作系统下凡物皆文件)
- 设备文件不是普通的磁盘文件
- 读写设备的数据需要与相应的设备驱动器通信
设备文件类型
- 字符设备:读写串行数据字节流,入串口终端等
- 块设备:随机读写固定尺寸数据亏啊,如磁盘设备
说明
- 设备挂载到文件系统后,使用文件和目录模式操作
- 程序一般用块设备,内核实现文件系统时使用块设备操作文件
4.2设备号
4.3设备项
4.4设备目录
操作系统已知的设备放到目录:/dev下
4.5硬件设备
4.6 特殊设备
最常用的就是哑设备,重定向之后就需要使用哑设备
4.7 随机数设备
4.8 设备的访问和控制
像文件一样操作设备
5.库
C++标准库:libstdc++
-
命令行开发时:编译C++11程序,使用g++ -4.8 -std=c++11;
在集成编译环境中不需要这么做,选择C++11选项就好了
C标准库:libc
-
linux中数学库是单独的:libm;需要调用数学函数时,显式链接数学库:g++ -o compute compute.c -lm
独立库和相关库的链接方式
5.1 动态库的装载与卸载
动态库中相当多的代码都是用C实现而不是C++实现的
6.makefile文件
有了IDE之后makefile的使用就变得很少了,但是在linux下了解使用makefile还是很必要的
make命令:负责C/C++程序编译与链接
- make根据指定命令进行构建
- 建构规则文件:GNUmakefile、makefile、Makefile(后两个常用)
6.1 makefile文件格式
个人理解:和yum、xml、json有一点相似,也类似写一个shell或者lau脚本
6.2 makefile语法
基本语法、变量、条件判断、循环、函数
makefile多行变量很少用,因为命令之间独立运行,最后产生的值有可能不确定,导致出错。
条件判断基本格式
循环
函数
二、散装知识点、问题
1.Linux命令行参数是做什么的?
功能拓展
2.中文状态下打出来的¥,英文状态下打出来$
3.学会使用日志调试系统程序