- 博客(16)
- 收藏
- 关注
原创 shell脚本
由于要处理的选项位于$1,因此额外的参数值就应该位于$2(因为所有的参数在处理完之后都会被移出)。因此,变量$3 的值会移入$2,变量$2 的值会移入$1,而变量$1 的值则会被删除(注意,变量$0 的值,也就是脚本名,不会改变)。getopt就是将所有命令行参数处理(结合选项拆分,分隔额外参数)成一个总的输出,通过不断的 shift 取$1、$2 得到选项和值。位置变量的名称都是标准数字: $0 对应脚本名, $1 对应第一个命令行参数, $2 对应第二个命令行参数,以此类推,直到$9。
2024-10-31 23:10:03
783
原创 getopt() / getopt_long()命令行参数解析函数
当getopt()返回-1后,optind是argv中第一个Operands(最后一个选项参数后紧跟的第一个参数,可以是NULL)参数的索引值。当匹配一个选项后,如果该选项带选项参数,则optarg指向选项参数的字符串;若该选项的选项参数为可选时,optarg为NULL表明无选项参数,optarg不为NULL时则指向选项参数字符串。opterr的值非0时,在getopt()遇到无法识别的选项,或者某个选项丢失选项参数的时候,getopt()会打印错误信息到标准错误输出。选项,它是用来用来决定程序的行为。
2023-06-27 14:05:18
3819
3
原创 sleep相关函数及毫秒级睡眠实现
以微妙为单位的睡眠函数。usec:待休眠的微妙数。以纳秒为单位的休眠函数。1秒=1000 毫秒 (ms)1秒=1,000,000 微妙 (μs)1秒=1,000,000,000 纳秒 (ns)//req: struct timespec类型指针,设置休眠的时间//rem: 若remain不为NULL,那么指针指向的缓冲区返回剩余的休眠时间/* 秒 *//* 纳秒 范围是0-999999999(9个9)*/
2023-05-31 10:49:56
1391
原创 结构体字节对齐
如果一个结构体B里嵌套另一个结构体A,还是以最大成员类型的字节对齐,但是结构体A存储起点为A内部最大成员整数倍的地方。),结构体A中的成员的对齐规则仍满足自身的规则。目前未补齐前结构体占10个字节(c1:1,保留3,c2:4,c3:2),不是4的整数倍,因此补齐两个字节,12为4的整数倍。c3:有效对齐值为2,因此排列在2的整数倍地址上,0x0002被占用,0x0004被占用,0x0006被占用,0x0008未占用可用。c2:有效对齐值为4,因此排列在4的整数倍地址上,0x0004未被占用可用。
2023-04-25 17:24:01
3617
3
原创 IP地址在代码中的应用
关于字节序的问题看这个:大端/小端字节序与网络字节序。 这是我们最常见的表示格式,比如某机的IP地址可能为“202.101.105.66”。 在网络传输中,TCP/IP协议使用网络字节序格式保存IP地址。 在主机内部,使用主机字节序保存和处理IP地址。1.2 IPv6 2、Socket网络通信地址 在网络通信中,一个地址标识一个特定通信域的套接字端点,为了使不同格式的地址都能够传入套接字函数,地址会被强转成一个通用的地址结构体,
2023-04-25 14:14:51
544
原创 大端字节序与小端字节序
在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定。在计算机系统中,当物理单位的长度大于1个字节时,就要区分字节顺序。假设将int整型在内存中的起始地址(首个字节存储位置)为0x1000,那么另外三个字节就存储在0x1000~0x1003。是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位。字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
2023-04-24 15:53:04
1307
原创 Linux设备驱动中的异步通知与异步I/O
阻塞与非阻塞访问、 poll() 函数提供了较好的解决设备访问的机制, 但是如果有了异步通知, 整套机制则更加完整了。,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念, 比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
2022-12-14 16:27:21
923
原创 Linux设备驱动中的阻塞与非阻塞I/O
;//定义等待队列头部};//定义并初始化一个名为name的等待队列元素/* 参数name:等待队列项的名字* 参数tsk:表示等待队列项属于哪个任务,一般设置为current(表示当前进程)*/
2022-12-14 16:27:07
724
原创 网络设备驱动
网络设备是Linux的第三类标准设备,没有对应的设备文件,使用内部设备名访问。网络设备及其驱动属于整个,实现遵循TCP/IP协议栈的要求。(网卡驱动属于)。网络设备接收外部的数据包,主动请求将硬件收到的数据包交给内核。
2022-12-09 11:23:29
1268
原创 Linux字符设备驱动
具体就是:内核虽然可以访问用户空间的缓冲区,但在访问之前会检查其合法性,通过。file_operations 结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会被应用程序调用Linux系统调用如open()/read()/write()/close()等时,最终被内核调用。调用register_chrdev()不能指定次设备号,那么函数内部会在内核中连续注册256个次设备号,也就是所有的次设备号都会被占用,而在大多数情况下都不会用到这么多次设备号,所以会造成极大的资源浪费。
2022-10-02 21:14:40
1154
原创 内核与用户空间的通信实现——ioctl(驱动+用户程序)
本文主要介绍内核空间与用户空间通信的一种方式----ioctl,用户程序可以通过调用ioctl函数来实现将一个cmd传给内核,而内核驱动根据switch case来实现预先设定好cmd对应执行的相关程序。学习ioctl是一个字符设备,所以在我们学习ioctl之前需要先了解一下linux设备驱动中的字符设备。
2022-09-24 23:54:49
7420
3
原创 C语言实现BC28NB模组上报数据到电信云
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言在用C语言实现bc28上报数据之前,需要了解bc28NB模组上报阿里云的流程。具体可参考之前的博客:BC28上报数据到电信云平台为了具有良好的移植性,我将整个项目封装了4层: 1.comport.c/h 这一层封装了端口的打开、初始化、关闭、发送数据和接收数...
2022-02-07 17:41:43
4160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅