随笔分类 - [ 编程语言 - Linux C ]#
摘要:一、测试环境 运行环境:server: arm64 linux-4.14(开发板) host: x86_64 ubuntu-20.04(主机) glic 版本:2.30 二、流程分析: 接上篇的疑问继续,前提条件,笔者的运行环境中没有包含任何 libnss 库, 测试程序如下: 1 #include
阅读全文
摘要:一、测试源程序: 【 list.h 文件 】 1 #ifndef _LIST_HEAD_ 2 #define _LIST_HEAD_ 3 4 /* 链表节点结构 */ 5 struct list_head { 6 struct list_head *prev; 7 struct list_head
阅读全文
摘要:一、简介 工作中可能遇到将一个文件编译进执行程序的需求,例如bin文件、jpg文件等等。实现的方法可以使用脚本来将文件内容写入一个新的C源文件数组,达成编译进程序的目的。 现在介绍一种简单、快捷的方法来实现需求,具体的操作如下文所述。 二、环境准备 <file> 文件内容: This is a te
阅读全文
摘要:一、源码编写编译 经过几天的学习,对动态链接进行一些简单的摸索,并将学习总结记录如下。 首先编写两个测试源码文件: [ main.c ] [ subFunc.c ] 编译源代码: 二、查看对应的ELF文件及反汇编代码 ① main ELF: ② main DISASM: 学习总结一: (1)与动态链
阅读全文
摘要:一、功能实现: ① 准备链接器脚本文件,可使用 ld --verbose > link.lds 命令生成。 ② 编辑 link.lds 文件,在 .data 段下添加如下内容,以建立自定义数据段。 .data : { *(.data .data.* .gnu.linkonce.d.*) SORT(C
阅读全文
摘要:1 /* 不限制 core 文件的大小 */ 2 ulimit -c unlimited 3 4 /* 使用 pid 进行命名 */ 5 echo "1" > /proc/sys/kernel/core_uses_pid 6 7 /* 配置 core 文件存储路径,及名称的格式 */ 8 echo
阅读全文
摘要:先来说一下 pthread_cancel 基本概念。 pthread_cancel 调用并不是强制终止线程,它只提出请求。线程如何处理 cancel 信号则由目标线程自己决定,可以是忽略、可以是立即终止、或者继续运行至 Cancelation-point(取消点),由不同的 Cancelation
阅读全文
摘要:一、初始化规则部分 在说明为什么要初始化之前,先提及下 C 语言的初始化规则,以备后用。可能大家在对数组进行初始化时用的是这样的方法: char buf[10] = {0}; 那么 char buf[10] = {1};是不是将每个数组中的每个元素都初始化为 1 了呢? 其实不然,根据编译器的特性,
阅读全文
摘要:"上一篇文章" 分析了内核中各种 initcall 的调用过程,在这个基础上大概掌握了内核中使用的这种方法,于是参考内核及网友的文章自己动手写了下,记录在这个随笔中。 源代码如下: ~~~ include include include typedef void ( myown_call)(void
阅读全文
摘要:简介: 读写锁与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁特性: 1. 读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。 2. 读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功。如果线程以写模式加锁会阻塞。 3. 读写锁是“读模式加锁”时,如果
阅读全文
摘要:文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux 通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。具体来讲,是通过借助 fcntl 函数来实现锁机制。当操作文件的进程没有获得锁时,虽然可以打开文件,但无法对文件执行执行 read、write 操作。 fc
阅读全文
摘要:我们知道 Mutex 互斥量是可以用在线程间同步的,线程之间共享进程的数据,mutex 就可以直接引用。而进程有自己独立的内存空间,要怎样将它应用在进程间同步呢?为了达到这一目的,可以在 pthread_mutex_init 初始化之前,修改其属性为进程间共享,并将其映射到共享内存中即可。 使用到的
阅读全文
摘要:线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙
阅读全文
摘要:先来看个例子: ~~~~ define TARGET_LITTLE_ENDINA 1 define TARGET_BIG_ENDINA 0 ifdef TARGET_LITTLE_ENDINA call little endina function else call big endina func
阅读全文
摘要:如果有下面这段代码: ~~~~ define min(x, y) ({ \ const typeof(x) _x = (x); \ const typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x
阅读全文
摘要:1. 语句表达式 GNU C 把包含在括号中的复合语句看做是一个表达式,称作语句表达式,它可以出现在任何允许表达式的地方。我们可以在语句表达式中使用原本只能在复合语句中使用的循环、局部变量等,例如: ~~~~ define min_t(type, x, y) \ ({ type _x = (x);
阅读全文
摘要:Linux 上可用的 C 编译器是 GNU C 编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C 是对标准 C 进行的一系列扩展,以增强标准 C 的功能。 1. 零长度和变量长度数组 GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如:
阅读全文
摘要:~~~~ include unsigned char ptr = NULL; unsigned char num = 3; static void fun(unsigned char mem) { mem = # } int main() { fun(&ptr); printf("%d \n
阅读全文
摘要:我们以 printf 这个 very 熟悉的函数为例,来分析一下变参函数。先看下 printf 函数的定义: ~~~~ int printf(const char fmt, ...) { int i; int len; / va_list 即 char / va_list args; va_star
阅读全文

浙公网安备 33010602011771号