LInux系统编程入门
2022/5/2 7:16:05
本文主要是介绍LInux系统编程入门,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、GCC
GCC(GNU Compiler Collection,GNU 编译器套件)是由 GNU 开发的编程语言编译器。GCC包括 C、C++、Objective-C、Java、Ada 和 Go 语言前端,也包括了这些语言的库(如 libstdc++, libgcj等)
GCC可以使用命令行选项来控制编译器在翻译源代码事应该遵循哪个C标准。例如,“-std = c99”启动GCC时,编译器支持C99标准。
安装命令 sudo apt install gcc g++
查看版本 gcc/g++ -v/--version
GCC工作流程
GCC常用参数选项
二、静态库与动态库
库文件时计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。
库是一种特殊的程序,编写库和编写一般的程序区别不大,只是库不能单独运行。
库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在运行时由系统加载到内存中供程序使用。
库的好处:代码保密;方便部署和开发
静态库的制作
动态库的制作
工作原理
程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamic dependencies)命令检查动态库依赖关系
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路 径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是 由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量 LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib 目录找到库文件后将其载入内存。
静态库的优缺点
优点:静态库被打包到应用程序中,加载速度快;发布程序无需提供静态库,移植方便
缺点:消耗系统资源,浪费内存;库的更新、部署、发布麻烦
动态库的优缺点
优点:可以实现进程间资源共享(共享库);更新、部署、发布简单;可以控制何时加载动态库
缺点:加载速度比静态库慢;发布程序时需要提供依赖的动态库
三、Makefile
Makefile的作用是“自动化编译”,Makefile文件定义了一系列的规则,指定了文件编译的顺序,以及是否需要重新编译和更复杂的功能操作。
make 是一个命令工具,是一个 解释 Makefile 文件中指令的命令工具,一般来说,大多数的 IDE 都有这个命令, 比如 Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make。
Makefile文件命名和规则
工作原理
变量
模式匹配
函数
四、GDB调试
GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环 境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。
一般来说,GDB 主要帮助你完成下面四个方面的功能: 1. 启动程序,可以按照自定义的要求随心所欲的运行程序 2. 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式) 3. 当程序被停住时,可以检查此时程序中所发生的事 4. 可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG
准备工作
关掉编译器的优化选项(`-O`), 并打开调 试选项(`-g`)。另外,`-Wall`在尽量不影响程序行为的情况下选项打开所有 warning,也可以发现许多问题,避免一些不必要的 BUG。
gcc -g -Wall program.c -o program
`-g` 选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机 器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调 试时必须保证 gdb 能找到源文件。
GDB命令
五、文件IO
标准C库IO函数
标准C库IO与linux系统IO的关系
虚拟地址空间
文件描述符
Linux系统IO函数
lstat是查看软连接的状态
stat结构体
st_mode变量
文件属性操作函数
#include <unistd.h> int access(const char *pathname, int mode); 作用:判断某个文件是否有某个权限,或者判断文件是否存在 参数: - pathname: 判断的文件路径 - mode: R_OK: 判断是否有读权限 W_OK: 判断是否有写权限 X_OK: 判断是否有执行权限 F_OK: 判断文件是否存在 返回值:成功返回0, 失败返回-1 #include <sys/stat.h> int chmod(const char *pathname, mode_t mode); 修改文件的权限 参数: - pathname: 需要修改的文件的路径 - mode:需要修改的权限值,八进制的数 返回值:成功返回0,失败返回-1 #include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length); 作用:缩减或者扩展文件的尺寸至指定的大小 参数: - path: 需要修改的文件的路径 - length: 需要最终文件变成的大小 返回值: 成功返回0, 失败返回-1目录操作函数
#include <unistd.h> int chdir(const char *path); 作用:修改进程的工作目录 比如在/home/nowcoder 启动了一个可执行程序a.out, 进程的工作目录 /home/nowcoder 参数: path : 需要修改的工作目录
#include <unistd.h> char *getcwd(char *buf, size_t size); 作用:获取当前工作目录 参数: - buf : 存储的路径,指向的是一个数组(传出参数) - size: 数组的大小 返回值: 返回的指向的一块内存,这个数据就是第一个参数 #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); 作用:创建一个目录 参数: pathname: 创建的目录的路径 mode: 权限,八进制的数 返回值: 成功返回0, 失败返回-1
目录遍历函数
// 打开一个目录 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 参数: - name: 需要打开的目录的名称 返回值: DIR * 类型,理解为目录流 错误返回NULL// 读取目录中的数据 #include <dirent.h> struct dirent *readdir(DIR *dirp); - 参数:dirp是opendir返回的结果 - 返回值: struct dirent,代表读取到的文件的信息 读取到了末尾或者失败了,返回NULL
// 关闭目录 #include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp);
dirent结构体和d_type
dup和dup2函数
#include <unistd.h> int dup(int oldfd); 作用:复制一个新的文件描述符 fd=3, int fd1 = dup(fd), fd指向的是a.txt, fd1也是指向a.txt 从空闲的文件描述符表中找一个最小的,作为新的拷贝的文件描述符 #include <unistd.h> int dup2(int oldfd, int newfd); 作用:重定向文件描述符 oldfd 指向 a.txt, newfd 指向 b.txt 调用函数成功后:newfd 和 b.txt 做close, newfd 指向了 a.txt oldfd 必须是一个有效的文件描述符 oldfd和newfd值相同,相当于什么都没有做
fcntl函数
#include <unistd.h> #include <fcntl.h>
int fcntl(int fd, int cmd, ...); 参数: fd : 表示需要操作的文件描述符 cmd: 表示对文件描述符进行如何操作 - F_DUPFD : 复制文件描述符,复制的是第一个参数fd,得到一个新的文件描述符(返回值) int ret = fcntl(fd, F_DUPFD);
- F_GETFL : 获取指定的文件描述符文件状态flag 获取的flag和我们通过open函数传递的flag是一个东西。
- F_SETFL : 设置文件描述符文件状态flag 必选项:O_RDONLY, O_WRONLY, O_RDWR 不可以被修改 可选性:O_APPEND, O)NONBLOCK O_APPEND 表示追加数据 NONBLOK 设置成非阻塞 阻塞和非阻塞:描述的是函数调用的行为。
参考资料:牛客c++项目实战
这篇关于LInux系统编程入门的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南