linux系统编程入门
GCC
- GCC(GNU Complier Collection,GNU编译器套件)
- GCC可以编译c、c++、java、Go、Ada、objective-C语言
GCC工作流
静态库
- 库文件是计算机上一种文件,看成一种代码仓库,提供一些可以直接拿来用的变量、函数或类
- 库是一种特殊的程序,只是不能单独运行
- 静态库:在程序链接阶段被复制到了程序中
静态库制作
- 命名规则
- 制作规则
静态库使用
- 创建一个.h头文件,里面声明我们要封装的那些函数
- 使用gcc把我们的.c文件编译成.o文件
- 使用ar rcs 制作成静态库
- 在我们自己的程序中包含静态库的头文件
- 编译我们自己的程序
- 把库给别人使用的时候,需要把 .a 和 .h文件都需要给别人
动态库
- 库文件是计算机上一种文件,看成一种代码仓库,提供一些可以直接拿来用的变量、函数或类
- 库是一种特殊的程序,只是不能单独运行
- 动态库:链接阶段没有被复制到程序时中,在运行时动态加载到内存中使用
动态库制作
- 命名规则
动态库使用
- 创建一个.h头文件,里面声明我们要封装的那些函数
- 使用gcc把我们的.c文件编译成.o文件
- 使用gcc -shared 制作成动态库
- 在我们自己的程序中包含动态库的头文件
- 编译我们自己的程序
- 把库给别人使用的时候,需要把 .so 和 .h文件都需要给别人
静态库和动态库优缺点
静态库
- 建议较小的库可以做成静态库
动态库
文件IO
标准C库IO函数
- 包含头文件 #include <stdio.h>
- C的IO在手册第3章,使用 man 3 fopen 命令就可以查看fopen的手册,其他类似
- 标准库函数和linux库函数的关系是调用给与被调用的关系,使用标准c库函数的时候,其底层也是调用的linux库函数。
linux系统IO函数
- linux系统IO在手册第二章,使用 man 2 open 命令就可以查看open的手册,其他类似
perror打印错误信息
- 他是在c标准库中的,使用方法
#include <stdio.h>
perror("test");
//这个函数打印的是最近的报错信息,比如要监测stat函数是否执行成功,就把这句放在stat函数之后,他的参数是一个字符串,随便啥都行,写了这个参数,报错信息就会接着这个字符串打印,比较方便看
虚拟地址空间
- 我们说的内存地址其实一般都是说的虚拟内存地址,而不是直接说的物理内存地址
- MMU这个模块就完成虚拟内存和物理内存之间的映射
文件描述符
- 文件描述符表是一个数组,最大1024,也就是说一个进程最多可以打开1024个文件
- 他的逻辑是,每次打开一个新文件时候,都会从表里找空闲的最小的那个去指向这个文件
- Linux中一切皆文件,包括设备,其实也是虚拟成文件去管理的,
linux库函数open打开文件
linux库函数open创建新文件
- 新创建的文件需要给一个用户权限,通过ll命令就可以查看文件权限
- 每个文件的的用户权限分为三部分,当前用户权限+当前组用户权限+其他用户权限
- 每个用户的权限用一个8进制数表示,比如 rwx 那就是111 对应10进制就是7
linux库函数read 和 write
文件拷贝demo
- 打开要拷贝的文件
- 创建一个新的文件
- 循环读写操作
- 关闭文件
linux系统库函数lseek函数
- 应用在拓展文件长度的时候,通过上面的操作之后,文件空间还不会相应的增大,这个时候还需要再写一个数据到文件中,文件才会相应的扩大,通过lseek增加的那部分空间上放的都是空数据。
- 比如原来有10个字节,leek增加100字节,在后面又写入一个字节,那文件最终就是111字节,其中的那100自己放的是空数据。
linux库函数stat 和 lstat
-
stat函数,用来获取文件的信息
-
用来获取软链接文件的信息,比如 b 文件是 a 文件的软链接,那么使用 stat 去获取 b 的信息,得到的其实是 a 的信息,如果想要获取 b 的信息,那就许哟啊用lstat
-
stat中的结构体
-
结构体中这个mode_t的说明
linux库函数文件属性操作函数
access—判断文件是否存在或者判断文件权限
chmod—修改文件权限
chown—修改文件所有者或者所在组
- 如何查看系统内所有用户的id和组id:gedit /etc/passwd
- 如何查看某一用户的id:id lenovo (这里以lenovo用户举例)
truncate—修改文件大小
- 扩大的尺寸填充一些空数据
- 缩小的尺寸会被删掉
linux库函数目录操作函数
- mkdir:创建文件夹
- rmdir:删除空文件夹
- rename:重命名文件夹
- chdir:改变当前进程的工作目录
6. getpwd:获取当前进程的工作目录
目录遍历函数
- opendir—打开目录
- readdir—读取目录中数据
dup 和 dup2 函数
fcntl函数
用来获取、设置文件描述符的flag