Linux系统编程(续)

news2024/9/21 22:56:33

静态库制作及使用步骤:
1.将.c生成.o文件
gcc -c add.c -o add.o
2.使用ar工具制作静态库
ar rcs lib自定义库名.a 后面需要的.c文件
3.编译静态库到可执行文件中
gcc test.c 自制的库.a -o test

注意:如果程序中没有函数声明,编译器会自动给个隐式声明,但会保warning
还有头文件是静态库的配套产品。

在这里插入图片描述
上图中的是为了防止多次载用头文件

动态库制作及使用:
1.将.c生成.o文件,(生成与位置无关的代码 -fPIC)
gcc -c add.c -o add.o -fPIC
2.使用 gcc -shared 制作动态库
gcc -shared lib库名.so add.o sub.o div.o
3.编译可执行程序时,指定所使用的动态库。 -l:指定库名(去掉lib前缀和.so后缀) -L:指定库路径
gcc test.c -o a.out -lmymath -L./lib
4.运行可以执行程序 ./a.out 出错!!!
原因:
链接器:工作于链接阶段,工作时需要-l和-L
动态链接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置。
解决方式:
【1】通过环境变量:export LD_LIBRARY_PATH=动态路径 ./a.out成功!!!(临时生效,终端重启后环境变量失效);
【2】永久生效:写入终端配置文件。.bashrc (建议使用绝对路径)
1.vi ~/.bashrc
2.写入export LD_LIBRARY_PATH=动态库路径 保存
3. …bashrc/ source .bashrc /重启 终端 -->让修改后的.bashrc生效
4. ./a.out成功!!!
【3.】 拷贝自定义动态库到./lib(标准C库所在目录位置)
【4】 配置文件法:
1. sudo vi /etc/ld.so.conf
2. 写入动态库绝对路径 保存
3. sudo ldconfig -v 使用配置文件生效
4. ./a.out 成功!!! —使用 ldd a.out 查看。

gdb调试工具:(大前提:程序是你自己写的)

基础指令:
-g:使用该参数编译可以执行文件,得到调试表。
gdb a.out
list:list 1 列出源码。根据源码指定,行号设置断点。
b/break:break 20 在20行位置设置断点。
run/r:运行程序
next/n:下一条指令(会越过函数)
step/s:下一条指令(会进入函数)
print/p:p i 查看变量的值
continue:继续执行断点后续指令。
quit:退出gdb当前调试。
其他指令:
run:使用run查找段错误出现的位置。
finish:结束当前函数调用。
set args:设置main函数命令行参数
run 字串1 字串2 … :设置main函数命令行参数
info b:查看断点信息表
b 20 if i = 5:设置条件断点。
ptype:查看变量类型。
bt:列出当前程序正存活着的栈帧。

系统read函数:
ssize_t read(int fd,void *buf,size_t count);
参数:
fd:文件描述符
buf:存数据的缓冲区
count:缓冲区大小
返回值:
成功:读到的字节数。
失败:-1,设置errno
0:读到文件末尾
-1:并且errno = EAGIN或EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。

系统write函数:
ssize_t write(int fd,const void *buf,size_count);
参数:
fd:文件描述符
buf:待写出数据的缓冲区
count:数据大小
返回值:
成功:写入的字节数
失败:-1,设置errno

错误处理函数 与errno相关。
printf(“xxx error:%d\n”,errno);
char *strerror(int errnum);
printf(“xxx error:%d\n”,strerror(errno));
void perror(const char *s);
perror(“open”)

系统调用和库函数的区别:
两个没有谁效率高还是低,只不过运用的需求不一样;系统调用应用在快速把用户内容输入输出到终端的需求;而库函数在向终端或者磁盘输入输出大数据的时候使用。

文件描述符:
PCB进程控制块:本质 结构体。
成员:文件描述符表。
文件描述符:0/1/2/3/4/5。。。/1023 表中可用的最小的。
0 - STDIN_FILENO
1 - STDOUT_FILENO
2 - STDERR_FILENO
文件描述符图:
在这里插入图片描述
阻塞,非阻塞:是设备文件,网络文件的属性。
产生阻塞的场景:读设备文件。读网络文件。(读常规文件无阻塞概念)
/dev/tty – 终端文件。
open(“/dev/tty”,O_RDWR|O_NONBLOCK) —设置/dev/tty非阻塞状态(默认为阻塞状态)

fcntl函数:
int flags = fcntl(fd,F_GETFL);
flgs |= O_NONBLOCK
fcntl(fd,F_SETFL,flgs);
获取文件状态:F_GETFL;
设置文件状态:F_SETFL;

lseek函数:
off_t lseek(int fd,off_t offset,int whence);
参数:
fd:文件描述符
offset:偏移量
whence:起始偏移量:SEEK_SET/SEEK_CUR/SEEK_END
返回值:
成功:较起始位置偏移量
失败:-1 errno
应用场景:
1.文件的“读”,“写”使用同一偏移位置。
2.使用lseek获取,拓展文件大小。
3.使用lseek拓展文件大小:要想使文件大小真正拓展,必须引起IO操作。
4.使用truncate函数,直接拓展文件。

传入参数:
1.指针作为函数参数。
2.同常有const关键字修饰。
3.指针指向有效区域,在函数内部做读操作。
传出参数:
1.指针作为函数参数。
2.在函数调用之前,指针指向的空间可以无意义,但必须有效。
3.在函数内部,做写操作。
4.函数调用结束后,充当函数返回值。
传入传出参数:
1.指针作为函数参数。
2.在函数调用之前,指针指向的空间有实际意义。
3.在函数内部,先做读操作,后做写操作。
4.函数调用结束后,充当函数返回值。注意这个充当加黑寓意,就是它可以当返回值,但是不是返回值。

文件存储:
inode:本质为结构体,存储文件的属性信息。如:权限,大小,时间,用户,盘块位置。。。也叫做文件属性管理结构,大多数的inode都存储在磁盘上

**dentry:**目录项,其本质依然是结构体,重要成员变量有两个{文件名,inode,…},而文件内容(data)保存在磁盘盘块中。

stat/lstat 函数:
头文件:<sys/stat.h>
结构体对象:struct stat a;
int stat(const char *path,struct stat *buf);
参数:
path:文件路径
buf:(传出参数)存放文件属性。
返回值:
成功:0;
失败:-1 errno;
获取文件大小:buf.st_size
获取文件类型:buf.st_mode
文件类型有以下几种:
在这里插入图片描述
获取文件权限:buf.st_mode
符号穿透:stat会;lstat不会。
注意:什么是符号穿透呢,详细一点讲就是比如建立软链接(快捷方式),用stat函数的话,它会直接穿透到源文件,反映出文件的类型等属性;而用lstat函数,它不会穿透到源文件,而是在建立的快捷方式这一层。

unlink函数特性:清除文件时,如果文件的硬链接数到0了,没有dentry(目录节点)对应,但该文件仍不会立马被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。

隐式回收:当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。

readlink函数
读取符号链接文件本身内容,得到链接所指向的文件名。
ssize_t readlink(const char *path,char *buf,size_t bufsiz);
成功:返回实际读到的字节数;
失败:-1设置errno为相应值。

rename函数
重命名一个文件。
int rename(const char *oldpath,const char *newpath);
成功:0;
失败:-1设置errno为相应值。

目录操作

在这里插入图片描述
目录操作函数:
DIR *opendir(char *name);
int close(DIR *dp);
struct dirent *readdir(DIR *dp);
struct dirent{
innode;
char dname[256];
}

重定向函数
int dup(int oldfd);
int dup2(int oldfd,int newfd);
头文件
#include <unistd.h>

dup函数是把原来open打开的函数的文件描述符大小给一个新的文件描述符,dup2函数是后面指向前面的区域(也是把旧的文件描述符给新的文件描述符)
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java+MySQL基于SSM的在线投票系统

随着社会的发展,人们在处理一些问题的时候不同意见越来越多,这源于人们对思想的解放和对社会的认识。所以在处理同一问题上,为了征求不同人的意见在线投票系统诞生了。 基于SSM的在线投票系统以钦州学院为背景,运用在校所学习的软件开发原理,采用Spring&#xff1a;SpringMVC&a…

如何在网页画一个旋转的粉色圣诞树(含源代码)

0 效果 做法&#xff1a; 创建三个文件tree.html、tree.js、tree.css&#xff0c;放在同一个目录下按1、2、3小节填充这三个文件浏览器打开tree.html文件 1 .HTML-基本布局 搞一个.html文件&#xff0c;内容如下 <!DOCTYPE html> <html lang"en"><…

【OpenCV-Python】教程:7-1 理解 kNN (k-Nearest Neighbour)

OpenCV Python 理解kNN &#xff08;k-Nearest Neighbour&#xff09; 【目标】 理解 kNN 算法的基本概念 【理论】 kNN是监督学习中最简单的分类算法之一。其思想是在特征空间中搜索与测试数据最接近的匹配。我们将用下图来研究它。 在图像中&#xff0c;有两个"家族…

一文看懂 InnoDB 的内存淘汰逻辑(LRU)

InnoDB淘汰的逻辑是怎样的呢&#xff1f; InnoDB 内存管理用的是最近最少使用 (Least Recently Used, LRU) 算法&#xff0c;这个算法的核心就是淘汰最久未使用的数据。 下图是一个 LRU 算法的基本模型。 InnoDB 管理 Buffer Pool 的 LRU 算法&#xff0c;是用链表来实现的。…

Go项目实战:02-微服务micro services

1、微服务&#xff08;micro services&#xff09; 单体式架构服务 过往大家熟悉的服务器。 特性&#xff1a; 1、复杂性随着开发越来越高&#xff0c;遇到问题解决困难。2、技术债务逐渐上升。3、耦合度高&#xff0c;维护成本大。 - 1、出现bug&#xff0c;不容易排查 - 2…

[ 数据结构 -- 手撕排序算法第六篇 ] 快速排序

文章目录前言一、常见的排序算法二、快速排序的基本思想三、快速排序的不同实现1.hoare版本2. 挖坑法3. 前后指针法4.三种版本单趟排序结果5.快速排序三数取中优化6.小区间优化四、快速排序的特性总结前言 手撕排序算法第六篇&#xff1a;快速排序&#xff01; 从本篇文章开始…

JavaSE面试题(二)

1&#xff1a;说一说八大基本数据类型 2&#xff1a;面向对象 面向对象的核心&#xff0c;就是类和对象。Java中的面向对象的思想&#xff1a;万物皆对象。 类&#xff1a;是对一类事物的描述&#xff0c;是抽象的&#xff0c;看不见&#xff0c;摸不着。 对象&#xff1a;是实…

week 7 吴恩达 调参 ,batch norm,softmax

文章目录前言7.1调整参数的过程 Turing progress7.2、scale7.3 如果在实践中探寻超参数7.4 batch normalization 批量归一化7.5 将BN算法拟合到神经网络中7.6 为什么 BN有效&#xff1f;7.7测试时的BN7.8 7.9 softmax regression7.10深度学习的框架前言 7.1调整参数的过程 Turi…

CentOS 8:环境变量

环境变量 环境变量&#xff0c;就是放在当前环境中的变量 无论Linux &#xff0c;还是Windows&#xff0c;都有环境变量 比如&#xff0c;最常用的环境变量 PATH, JAVA_HOME 定义环境变量 export JAVA_HOME/opt/jdk1.8 显示环境变量 echo $JAVA_HOME 查看所有环境变量…

c语言位操作和变量存储类型

c语言位操作 c语言变量存储类型 格式[存储类型说明符] 数据类型说明符 变量名&#xff0c;例如&#xff0c;auto int a;但一般情况下auto是省略的 其他类型说明符还有&#xff1a;static 、extern、register auto最普通动态存储&#xff0c;但所在范围的函数程序结束后&#xf…

处理模型视图中的选择

有关在视图中选择的项的信息存储在QItemSelectionModel类中&#xff0c;这将维护单个模型中项的模型索引&#xff0c;并且独立于任何视图。由于一个模型可以有多个视图&#xff0c;因此可以在视图之间共享选择&#xff0c;从而允许应用程序以一致的方式显示多个视图 选择由选…

Redis高并发锁(二)乐观锁

文章目录redis乐观锁1. watch 监控key2. multi 开启事务3. exec 执行事务4. 演示1) 先用两个连接AB访问redis2) A监控key,此时库存是45013) A开启事务&#xff0c;并且将库存-1,事务进入队列等待执行4&#xff09;此时B更新库存为20015&#xff09;A开始执行事务业务改造1. Sto…

C++11--包装器与可变参数摸板

文章目录可变参数模板递归函数方式展开参数包函数包装器举个例子bind函数举个例子可变参数模板 C11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args... args&…

Spring Cloud之Feign消费和Hystrix熔断

Spring Cloud的Feign消费和Hystrix熔断 现如今&#xff0c;由于互联网的流行&#xff0c;很多特产都可以在网上订购&#xff0c;你可以在堆满积雪的冬北订购海南的椰子&#xff0c;海南的椰子就会采用很快的物流方式调送到堆满积地的东北&#xff0c;就相当于在本地实现了买椰…

Opencv(C++)笔记--图像金字塔

目录 1--图像金字塔的原理 2--图像金字塔的用途 3--Opencv API 3-1--拉普拉斯金字塔上采样 3-2--高斯金字塔下采样 3-3--代码实例 4--参考 1--图像金字塔的原理 图像金字塔常用于图像缩放&#xff08;resize&#xff09;和图像分割当中&#xff0c;不同分辨率的图像以金…

CSS基础总结(四)浮动

文章目录 一、为什么需要浮动 1.传统网页布局的三种方式 2.标准流 二、浮动的概述 三、浮动的特性 1.脱标 2.一行显示&#xff0c;顶部对齐 3.具备行内块元素特性 四、清除浮动 1.为什么要清除浮动 2.清除浮动的本质与策略 3.清除浮动的四大方法 &#xff08;1&…

解决安卓刷新recyclerView时导致itemDecoration分栏标题绘制错乱(重叠和隔空现象)

安卓的 itemDecoration 装饰器是个好东西&#xff0c;可以与adapter适配器一样闪耀。但是刷新的时候有可能发生重叠绘制或者莫名隔空的BUG。 三、原作 本文分栏标题装饰器的原作者为简书博主endeavor等人&#xff1a; https://www.jianshu.com/p/8a51039d9e68 二、隔空 紧…

Java+MySQL基于ssm的残疾人管理系统

我国残疾人人口数量相当巨大,据中残联给出的数据,我国约有8500万残疾人。残疾人是社会弱势群体,并且数量庞大影响人数众多,如何能更好的对这些残疾人进行关注和帮助他们更好的生活是当下社会研究的一个主要问题之一,于是我们提出了残疾人信息管理系统的设计与开发。 本课题是一…

内核驱动修改内存

概述 本文会利用内核驱动进行读写取第三方应用内存。 内核实现会使用内联汇编 所以对于内核数据结构每个windwos版本不一样需要判断&#xff0c;本文使用19041所写代码。 命令行&#xff1a;winver 即可查看你当前的版本&#xff0c;如下图19042.631 就是构建版本号 或者调用…

痞子衡嵌入式:低功耗高性能边缘人工智能应用的新答案 - MCXN947

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦MCX系列MCU的新品MCXN947。 自 2015 年恩智浦和飞思卡尔合并成新恩智浦之后&#xff0c;关于它们各自的 Arm Cortex-M 内核通用微控制器代表作系列 LPC 和 Kinetis 接下来怎么发展…