Unix/Linux环境编程
文章平均质量分 65
Unix/Linux环境编程学习
猪哥-嵌入式
这个作者很懒,什么都没留下…
展开
-
深入理解Linux 条件变量4:pthread_cond_signal惊群现象及解决方法(while判断)
前言原创 2022-03-31 22:46:56 · 3167 阅读 · 3 评论 -
深入理解Linux 条件变量3:条件变量为什么要配合着锁使用?
https://zhuanlan.zhihu.com/p/55123862为什么要与pthread_mutex 一起使用呢? 这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 释放锁并进入wait_cond状态 ,此时线程2上锁) 的原创 2022-03-30 22:31:40 · 3156 阅读 · 2 评论 -
深入理解Linux 条件变量2:使用条件变量实现[生产-消费]框架
前言原创 2022-03-29 22:45:43 · 909 阅读 · 2 评论 -
深入理解Linux 条件变量1:使用场景、接口说明
背景原创 2022-03-29 22:16:10 · 1340 阅读 · 0 评论 -
Linux时间相关知识小结:struct timeval、timespec、gettimeofday、time、localtime....
前言我们在linux平台进行开发时,时间相关的操作基本上都会遇到,本文就对常用的时间相关的结构体、接口进行分析小结。常见类型、结构体定义timespec原型struct timespec{ __time_t tv_sec; /* Seconds. 秒 */ __syscall_slong_t tv_nsec; /* Nanoseconds. 纳秒*/};说明该结构体只是包括秒和纳秒,并没有任何其他含义,比如1970年以来的秒数等。只是个存放空间。为clock_gettime的原创 2022-02-06 22:49:52 · 4745 阅读 · 0 评论 -
>/dev/null 2>&1分析
这里写自定义目录标题背景知识Linux中与输入输出相关的文件描述符Linux shell 输出重定向的目的Linux Bash支持的输出重定向语法背景知识Linux的重定向指的是[改变输入/输出的方向],一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序中使用,这就是标准的输入方向,反过来,程序也会产生数据,这些数据都是呈现在显示器上,这就是标准输出方向。简单的说:输入方向就是数据从哪里流向程序,数据默认从键盘流向程序,如果改变它的方向,数据就从其他地方流入,这就是输入重定向。原创 2021-08-16 22:46:24 · 380 阅读 · 0 评论 -
字符串转数字函数 atol、atoll和strtol、strtoll、strtoul、strtoull 分析
前言在C/C++编程中,经常会遇到将字符串转换成数值的场景需求,其实在C标准库中已经给我们提供了很多功能函数。常用字符串转数值函数列表头文件#include <stdlib.h>ato-x函数名称含义相似功能函数double atof(const char *nptr)将字符串转换成double值strtod(nptr, NULL)int atoi(const char *nptr)将字符串转换成int值strtol(nptr, NULL, 10原创 2021-07-25 22:02:58 · 6440 阅读 · 2 评论 -
内存泄露和内存溢出的区别
前言对于程序员来讲,这是两个学术性的概念,虽然大多数人都会遇到,可能叫不上名字。内存泄露Memory Leak:指程序在申请内存后,用完后,没有释放。通俗解释1: 用完内存扔了,没有归还。通俗解释2: 甲向乙借了100万,花完,没有还。内存溢出Memory Overflow:指程序申请内存时,没有足够的内存共申请者使用。通俗解释1: 霸占了不属于你的资源。通俗解释2: 甲向乙借1000万,但是乙只有100万。...原创 2021-07-23 14:17:29 · 208 阅读 · 0 评论 -
shell [ ] 条件判断标识 笔记
文件表达式判断标识描述-e filename如果filename存在, 则为真-d filename如果filename是目录, 则为真-f filename如果filename为常规文件, 则为真-L filename如果filename为符号链接, 则为真-r filename如果filename可读, 则为真-w filename如果filename可写, 则为真-x filename如果filename可执行, 则为真-s原创 2021-07-22 16:29:54 · 140 阅读 · 0 评论 -
一种程序防盗加密思路
需求场景采用的是开源硬件,linux平台,程序拷贝到硬件上,应用程序功能是多种多样,比较复杂的,还会涉及到后期进行OTA升级,所以如果直接采用程序绑定硬件唯一ID是不方便的,基于这些原因,我们可以参考软件行业里的加密狗思路,给我们的程序增加一个软加密狗,这个软加密狗是与硬件唯一绑定的,可以认为一机一密。思路1、软加密狗程序尽可能的简单,只做2件事儿:1、检查当前硬件唯一ID是否合法。2、提供查询接口(信号、共享内存、消息队列)等,当应用程序查询当前硬件是否合法时,返回OK或ERROR。当然,这原创 2021-04-26 18:34:51 · 440 阅读 · 0 评论 -
Linux进程启动过程分析
前言在上一篇文章《深入分析linux下 动态库的显性调用(dlopen)和隐性调用区别》 我们分析了动态库的显性和隐性调用区别,里面提到了进程运行加载的一些知识点,本文做一个简单的总结。进程启动过程1、搜索器所依赖的动态库(隐形调用动态库)。2、加载隐性调用的动态库到内存。3、初始化隐性调用的动态库。4、初始化进程。5、将程序的控制权移交给main函数,也就是从main入口。6、如果程序运行到 dlopen , 将动态库加载到内存,然后初始化,再使用dlsym 调用。...原创 2021-04-08 18:36:57 · 643 阅读 · 0 评论 -
深入分析linux下 动态库的显性调用(dlopen)和隐性调用区别
前言在linux环境下编程,我们如果想要使用第三方的库,基本上有以下几种方式:1、将第三方库的源码合并到我们的工程项目代码中,一起编译。2、将第三方库编译成静态库(xxx.a),我们在使用时,在Makefile中引用该静态库。3、将第三方库编译成动态库(xxx.so), 我们在使用时,隐性调用该动态库,具体表现为需要 在程序中包含动态库的 头文件,同时需要在/usr/lib路径下,存放动态库文件,以便程序调用。4、将第三方库编译成动态库(xxx.so), 我们在使用时,显性调用该动态库,在程序原创 2021-04-08 11:37:13 · 5071 阅读 · 0 评论 -
Linux 删除某一目录下的所有特定类型 文件
shell命令如下:find ./ -name "*.o" | xarg rm -rf上述命令表示,查找当前目录下,所有后缀名为 .o 的文件,并且删除,其中 xarg 为 shell中管道 传参过滤器。原创 2021-03-17 10:56:31 · 2519 阅读 · 0 评论 -
segmentation fault (SIGSEGV) 定位方法
我们在Linux下进行程序开发,如果程序代码不严谨,会经常遇到segmentation fault报错,这种报错的结果就是程序会直接挂掉,很难在程序里一下子定位到问题代码。原因segmentation fault 就是经常说的内存泄露/溢出: 当一个进程执行一个无效的内存引用,或发生断错误时,会触发 SIGSEGV信号,内核默认的动作就是 终止该进程。这个最常见的就是,比如我们使用了 非法指针: 1 #include <stdio.h> 2 #include <strin原创 2021-03-12 18:46:30 · 21865 阅读 · 2 评论 -
Linux I/O底层原理揭秘
本文转载腾讯游戏工程师:Linux I/O底层原理全面揭秘这里向作者致敬,写的非常棒,从技术背景到原理,通俗易懂。摘要从虚拟内存、I/O 缓冲区,用户态&内核态以及 I/O 模式等等知识点全面而又详尽地剖析 Linux 系统的 I/O 底层原理,分析了 Linux 传统的 I/O 模式的弊端,进而引入 Linux Zero-copy 零拷贝技术的介绍和原理解析,将零拷贝技术和传统的 I/O 模式进行区分和对比,帮助读者理解 Linux 内核对 I/O 模块的优化改进思路。前言如今的网络应用转载 2021-03-10 22:10:01 · 1246 阅读 · 0 评论 -
什么是RISC-V
本文转自什么是RISC-V 向作者致敬。RISC-V读作RISC Five,也即第五代精简指令处理器什么是RISC和CISC?RISC(精简指令集计算机,Reduced Instruction Set Computer-RISC)和CISC(复杂指令集计算机,Complex Instruction Set Computer-CISC)是CPU的两种架构,区别在于不同的CPU设计理念和方法。早期的CPU全部是CISC架构。计算机性能的提高可以通过增加硬件的复杂性来获得,随着集成电路技术,特别是VLSI转载 2021-02-19 18:25:43 · 11309 阅读 · 1 评论 -
socket编程tcp server 示例2:多client,单线程轮询
前言在上一篇文章中,采用select的方式,通过存储client数组存放client fd,实现了tcp server,文本参考libmodbus 中modbus tcp server的思路,相当于对上一篇文章的优化,不需要使用client数组,通过轮询就能实现多client连接。代码#define NB_CONNECTION 5static modbus_t *ctx = NULL;static modbus_mapping_t *mb_mapping;static int serv原创 2021-02-19 10:50:24 · 778 阅读 · 0 评论 -
socket编程tcp server 示例1:多client,单线程,固定client数
前言编写tcp server有很多种思路,本示例采用unix网络编程中的,单线程,多client,通过固定client数量来实现。代码逻辑socket(....)bind(...)listen()client[]初始化FD_ZERO()FD_SET()while(1){ rc = select(....); if(rc == 新客户端连接){ accept(...) 存储新client socket fd } if(rset == client){ 读取客户端发送的ms原创 2021-02-19 10:36:21 · 778 阅读 · 0 评论 -
INADDR_ANY和127.0.0.1
背景在编写tcp server程序时,涉及到server 的IP绑定,经常能看到127.0.0.1 还有 INADDR_ANY,这两者还是有很大的区别的,尤其是通过另外一台设备上tcp client去连接server时,如果设置为127.0.0.1,将会连接失败。127.0.0.1这个地址通常分配给loopback接口,loopback是一个特殊的网络IP,可以理解为虚拟网卡,用于本机中各个应用之间的网络交互,只要操作系统网络组建正常,loopback就能工作。所以这里需要明白使用127.0.0.1进原创 2021-02-18 16:09:15 · 1697 阅读 · 0 评论 -
systemctl 启动/关闭/启用/禁用服务 总结
启动服务systemctl start vsftpd.service关闭服务systemctl stop vsftpd.service重启服务systemctl restart test.service显示服务的状态systemctl status test.service在开机时启用服务systemctl enable test.service在开机时禁用服务systemctl disable test.service查看服务是否开机启动sys原创 2020-12-14 13:53:00 · 6855 阅读 · 0 评论 -
Posix 消息队列 实例分析
一、概述在linux应用开发中,消息队列的应用场景很普遍,比如最常见得生产 --消费模型,一方产生数据,并把数据放入队列中,而另一方从队列中取数据。linux中的消息队列的主要用途为进程间通信,当然,也可以进行 “线程间通信”。 我们可以简单的理解为: (1)创建了一个消息队列,相当于在内核层面,创建了一个链表,这也就意味着这个消息队列,在不主动删除的情况下,会一直存在,即便是创建它的进程退出后,该消息队列仍然存在。消息队列在内存中可能的布局如下: (2)消息队列...原创 2020-12-06 22:13:41 · 547 阅读 · 0 评论 -
Linux:主线程退出对子线程的影响
有一种说法:“主线程退出,子线程也会跟着退出”,其实这是不严谨的, 在linux下其实是没有所谓的“主线程”和“子线程”区分的,都是线程,只不过main函数比较特殊,如果main函数执行到最后 return 0退出,这里的return 其实会默认调用函数exit,然后退出该进程,因为进程运行完毕,退出导致所有创建的线程也跟着退出了。如果我们在子线程中,调用 pthread_cancel(main_tid) 提前终止main,那么子线程是不会退出的。...原创 2020-11-03 21:49:07 · 1749 阅读 · 0 评论 -
gettimeofday() 和 clock_gettime()函数 分析小结
在上一篇文章《struct timeval 和 struct timespec 应用小结》我们分析了与linux系统时间相关的结构体定义,在linux系统C编程中,获取系统时间的api函数有两个,分别为:int gettimeofday(struct timeval *tv, struct timezone *tz)int clock_gettime(clockid_t, struct timespec *)我们逐个分析:1、gettimeofday() 该函数把当前时...原创 2020-10-29 22:40:06 · 8441 阅读 · 0 评论 -
struct timeval 和 struct timespec 应用小结
在基于linux的C编程中,经常会看到 struct timeval和struct timespec 这两个跟时间有关的结构体,有时候会容易混淆,先看下这两个结构体的定义,以linux-2.6.35为例,在time.h下struct timeval { __kernel_time_t tv_sec; /* seconds */ __kernel_suseconds_t tv_usec; /* microseconds */};struct timespec { __kernel原创 2020-10-29 22:13:06 · 1687 阅读 · 0 评论 -
undefined reference to symbol ‘pow@@GLIBC_2.2.5 编译错误解决方法
解决方案:gcc编译时增加 -lm选项,这样程序就能引用libm.so(libmath)库了。 该错误的含义并不是glibc库的错误,而是pow符号未定义, pow是数学中的求幂函数,也就是说,如果我们在C文件中引用了math.h ,那么在使用gcc编译时,必须添加 -lm选项,因为书序函数是位于libm.so库文件中的,-lm选项告诉编译器书序函数要到这个库文件中查找。...原创 2020-10-15 15:24:19 · 11694 阅读 · 0 评论 -
sprintf、snprintf、vsprintf、vsnprintf格式化函数分析
格式化输入、可变参数表格式化输入。原创 2020-05-29 10:42:04 · 4859 阅读 · 0 评论 -
fcntl函数的作用及应用场景
在unp书中,关于函数fcntl的参数讲解的比较多,但是这个函数功能只有简单的一句话“fcntl函数可以改变已经打开文件的属性”。我们知道,在Unix/linux环境下,不管是设备、I/O、socket等等,几乎一切都是文件,所以fcntl的功能就是对于这些设备、文件、I/O的属性进行设定,比如常用的功能:1、复制一个已有的描述符,类似于dup函数功能。2、获取/设置文件描述符标志。3、获取/设置文件状态标志。4、获取/设置一步I/O所有权。5、获取/设置记录锁。fcntl的功能很强大,也很全原创 2020-05-26 22:35:04 · 2316 阅读 · 0 评论 -
linux下 O_NONBLOCK与O_NDELAY的区别
在上一篇文章《linux下“阻塞”与“非阻塞”的定义及区别》中,我们分析了阻塞和非阻塞两种模式,与“非阻塞模式”相关的有两个 标志,就是 O_NONBLOCK与O_NDELAY,这两种参数的结果都是使I/O操作设置为“非阻塞模式”,也就是non-blocking,当进行read/write操作时,不管结果如何,都会马上返回,而不会阻塞。他们的区别是:在read时,如果读不到数据,O_NDELAY会返回0,由于正常读取到文件末尾时,也会返回0,这样就无法区分是否是遗产隔离,所以就引入了O_NONBLOCK,原创 2020-05-26 22:23:02 · 3840 阅读 · 0 评论 -
linux下“阻塞”与“非阻塞”的定义及区别
前言在unix/linux下,不管是设备、文档、可执行程序,对于内核来说,都是文件,都会涉及到open、read、write的操作,对于文件操作就有了“阻塞”和“非阻塞”的概念了,我们以串口设备来举例分析这两种概念,首先保证,我们已经打开并初始化一个串口。“阻塞”的定义对于 read,当串口的接收缓冲区没有数据的时候,read函数会阻塞在那里,不返回,程序也无法下一步执行,一直到串口的接收缓冲区中有数据可读时,read读到了想要长度的字节数后才会返回,返回值为读到的字节数。对于write,当串口发送原创 2020-05-26 21:55:21 · 2601 阅读 · 0 评论 -
dup函数分析及应用场景
dup应用场景分析Unix系统中支持不同的进程共享的打开文件,dup函数可以复制一个现有的文件描述符,这里的“复制”不是说dup返回完全一样的文件描述符,那是没有意义的。而是返回一个当前可用文件描述符中的最小数值,通过这一新的文件描述符也可以访问该文件。“共享”的分析上面提到了“共享”,对于刚接触文件描述符的人来说,可能会有些疑问,为什么要“共享”,将文件描述符作为一个“全局变量”访问不是很方便吗?有这种想法的,往往是因为我们大多数情况下的应用范围都是仅限于1个进程,即便1个进程下有多个线程,对于单进原创 2020-05-23 22:44:44 · 2486 阅读 · 0 评论 -
strerror和perror函数的用法及区别
strerror原型#inlcude <string.h>char *strerror(int errnum);strrerror 函数将errnum映射为一个出错消息字符串,并返回该字符串指针,这里的“字符串”是Unix中已经定义好的常量字符串。perror原型#inlcude <stdio.h>void perror(char *msg);perro函数是基于当前的errno值,在标准错误(控制台)上输出一条出错消息,它首先输出由msg指向的字符串,然后跟一个冒原创 2020-05-20 22:29:26 · 972 阅读 · 0 评论