最全面的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.学会使用日志调试系统程序

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值