Linux高级编程
阿基米东
本科毕业于国内某知名双非理工大学,当过校队球员,后自学编程,专注于嵌入式软件开发十余年,在物联网、机器人、汽车等领域拥有实战经验,也是多个开源项目的贡献者,对 Web 前后端、AI 技术略知一二。立志成为一名杰出的开源创客,让世界因我而变得更美好!
展开
-
一个灵活的程序应该是可配置的
这段时间在公司充当救火员的角色,拯救了一个快要腐烂的项目。其中做的一个工作就是将其变成可配置的,这样可以增加程序的灵活性,如果想改变程序的行为,只需修改参数即可,而不是重新编译。首先我们需要把程序中可变的部分抽离出来,程序本身只处理业务逻辑,实现配置参数与功能代码的解耦合。在 Linux 环境编程中,通常有两种做法:通过配置文件与程序进行交互通过命令行选项参数进行交互配置文件的格式可...原创 2020-03-14 12:56:37 · 1069 阅读 · 0 评论 -
ALSA 音频数据传输 underrun 和 overrun
在 ALSA 数据传输中,最容易出现的错误是 underrun 和 overrun。pcm 播放的时候,接口 snd_pcm_writei 返回 -EPIPE,为 underrun(不足)录制音频的时候, 接口 snd_pcm_readi 返回 -EPIPE, 为 overrun(超载)使用 ALSA 架构的驱动程,在实际开发使用过程中,比较常见的错误有 -EPIPE,为什么会出现呢?肯...原创 2020-03-09 22:43:11 · 6647 阅读 · 3 评论 -
Python Web 学习之 NAT 技术
NAT 技术也叫网络地址转换技术,是一种私有地址转换成合法/公网 IP 地址的技术。下面我们一起来了解一下,什么是私有地址,什么是合法 IP 地址,以及为什么要引入 NAT 技术。NAT 技术私有地址和合法地址如果组建一个局域网,其中的 IP 地址仅用于局域网内部通信,而不能直接连到 Internet 的话,那么这些IP地址就是局域网的私有 IP 地址。理论上所有 IP 地址均可作为私有 ...原创 2018-10-09 23:44:51 · 2203 阅读 · 0 评论 -
GDB 调试工具使用指南
GDB 概述 GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。也许大多数开发人员比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件开发,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ 寸有所长,尺有所短 ” 就是这个道理。 一般来说, GDB 可以帮助你完成以下...原创 2018-05-30 21:11:44 · 2158 阅读 · 0 评论 -
Linux 命令行程序的参数识别
我们几乎都是从 Windows 的操作开始学习计算机的,我第一次接触计算机是在初中的时候,当时学校机房安放的都是大块头,搭配经典的XP系统,俨然就是那个时代我对计算机的全部认识。之后很长一段时间,我也一直认为:“哦,电脑这东西,不就是在 Windows 上点来点去吗”?直到大学偶然的机会,我接触了 Linux 系统,才恍然大悟,要是我从一开始就用 Linux 学习计算机那该多好呀! ...原创 2018-05-29 21:11:17 · 2494 阅读 · 0 评论 -
Linux C 程序执行 shell 命令并获取返回结果的方法
据说有统计数据表明,代码的缺陷率是一定的,与所使用的语言无关。Linux提供了很多的实用工具和脚本,在程序中调用工具和脚本,无疑可以简化程序,从而降低代码的缺陷数目。Linux shell 脚本也是一个强大的工具,我们可以根据需要编制脚本,然后在程序中调用自定义脚本。 《Unix 编程艺术》中有一句话“一行 Shell 脚本胜过万行 C”。那么在 Linux 编程中,C 程序如何调用 shel原创 2017-11-29 21:08:43 · 35258 阅读 · 4 评论 -
Linux网络编程——Unix本地套接字
概述 今天,给大家讲解网络编程中的一个内容——Unix 本地套接字。 发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并且这种网络 socket 同样支持单台主机上的进程间通信,当然这样做的话,仍然需要 IP 地址和端口号(通过 loopback 地址 127.0.0.1)。Unix本地套接字,其实就是一种专门原创 2017-10-26 12:13:18 · 15905 阅读 · 1 评论 -
Linux高级编程——线程信号处理
Linux 多线程环境中的信号处理不同于进程的信号处理。一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理。 本文首先介绍信号处理在进程中和线程间的不同,然后描述相应的线程库函数,在此基础上给出一组示例代码,以讨论线程编程中信号处理的细节和注意事项。 本文通过 sigwait() 调用来“等待”信号,而通过 signal()/sigac原创 2017-09-27 12:08:04 · 3071 阅读 · 1 评论 -
Linux 网络编程——TCP 粘包及其解决方案
首先,我们回顾一下 TCP 和 UDP 的头部信息: 图1. TCP 头部 图2. UDP 头部 我们知道,TCP 和 UDP 是 TCP/IP 协议族传输层中的两个具有代表性的协议。其中,TCP 是面向连接的复杂的、可靠的字节流传输协议,而 UDP 是面向无连接的简单的、不可靠的数据报传输协议。“流”的概念就是指不间断的数据结构,可以把它想象成你们家里的自来水管道中的水流。什么意思呢?举个例原创 2017-08-20 16:31:59 · 3996 阅读 · 0 评论 -
Linux下U盘自动识别和挂载
这里提供一个Linux下U盘自动识别和挂载的程序,不是Shell脚本喔。#define UEVENT_BUFFER_SIZE 2048#define NETLINK_KOBJECT_UEVENT 15int init_hotplug_sock(void){ const int buffersize = 1024; int ret; int s; struct so原创 2017-03-30 20:03:10 · 6440 阅读 · 1 评论 -
Linux操作系统实时性分析
1. 概述 选择一个合适的嵌入式操作系统,可以考虑以下几个因素: 第一是应用。如果你想开发的嵌入式设备是一个和网络应用密切相关或者就是一个网络设备,那么你应该选择用嵌入式Linux或者uCLinux,而不是uC/OS-II。 第二是实时性。没有一个绝对的数字可以告诉你什么是硬实时,什么是软实时,他们之间的界限也是十分模糊的,这与你选择什么样的CPU,它的主频、内存等参数有一定关系。如果原创 2016-12-11 13:02:46 · 23468 阅读 · 5 评论 -
关于Linux的应用层定时器
使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。要达到这一目的,一般有两个常见的比较有效的方法。一个是用 Linux 内部的三个定时器;另一个是用 sleep 或 usleep 函数让进程睡眠一段时间;其实,还有一个方法,那就是用 gettimeofday、difftime 等自己来计算时间间隔,然后时间到了就执行某一任务,但是这种方法效率低,所以不常用。 1原创 2016-11-08 11:22:55 · 18330 阅读 · 0 评论 -
阻塞、非阻塞的概念和select函数的阻塞功能
(1)阻塞block 所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。 例如socket编程中connect、accept、recv、recvfrom这样的阻塞程序。 再如绝大多数的函数调用、语句执行,严格来说,他们都是以阻塞方式执行的。(2)非阻塞non-block 所谓非阻塞原创 2016-09-05 00:19:48 · 2814 阅读 · 0 评论 -
linux内核中异步通信机制--信号处理机制
什么是异步通信?很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序就不需要查询设备状态,就像硬件上常提的“中断的概念”。比较准确的说法其实应该叫做“信号驱动的异步I/O”,信号是在软件层次上对中断机制的一种模拟。阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通信则意味着设备通知应用程序自身可访问。一、系统中存在的异步机制 我认为异步转载 2016-04-12 11:25:29 · 2390 阅读 · 1 评论 -
僵尸进程的产生与避免
一个进程调用exit命令结束自己的生命的时候,其实它并没有真正被销毁,而是留下一个成为zombie的数据结构。僵尸进程是非常特殊的一种,因为它已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留了一个位置,记录这该进程的退出状态等信息以供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。 僵尸进程需要它的父进程来为它收尸,O_O!! 如果它的原创 2013-12-14 22:00:11 · 1677 阅读 · 0 评论