![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux编程
文章平均质量分 83
落尘纷扰
服务于制造业的码农,没怎么写过代码
展开
-
使用gcc的-finstrument-functions选项进行函数跟踪
GCC Function instrumentation机制可以用来跟踪函数的调用关系,在gcc中对应的选项为“-finstrument-functions”。可查看gcc的man page来获取更详细信息。编译时如果为gcc加上“-finstrument-functions”选项,那在每个函数的入口和出口处会各增加一个额外的hook函数的调用,增加的这两个函数分别为:void __cyg原创 2015-03-03 22:34:43 · 9499 阅读 · 8 评论 -
[openwrt] 使用ubus实现进程通信
ubus为openwrt平台开发中的进程间通信提供了一个通用的框架。它让进程间通信的实现变得非常简单,并且ubus具有很强的可移植性,可以很方便的移植到其他linux平台上使用。本文描述了ubus的实现原理和整体框架。ubus源码可通过git库 git://nbd.name/luci2/ubus.git 获得,其依赖的ubox库的git库:git://nbd.name/luci2/ubox.git...原创 2015-05-10 22:55:47 · 53469 阅读 · 6 评论 -
GNU/Linux awk命令用法详解
本来计划年前写完的,结果现在才搞定,手册的内容一边翻一边实验,还有awk版本问题,又参考Effective AWK Programming对语法和示例做了些补充。终于写完了,大家元宵节快乐!AWK简介AWK是一门解释型的编程语言,它的名字来源于它的三位作者的姓氏:Alfred Aho,Peter Weinberger和Brian Kernighan。AWK能够应用于广泛的计算和数据处理任务。所有的...原创 2017-02-11 21:34:54 · 10751 阅读 · 1 评论 -
linux编程 - C/C++每线程(thread-local)变量的使用
在一个进程中定义的全局或静态变量都是所有线程可见的,即每个线程共同操作一块存储区域。而有时我们可能有这样的需求:对于一个全局变量,每个线程对其的修改只在本线程内有效,即每个线程虽然共享这个全局变量的名字,但这个变量的值就像只有在本线程内才会被修改和读取一样。线程局部存储和线程特有数据都可以实现上述需求。1. 线程局部存储线程局部存储提供了持久的每线程存储,每个线程都拥有一份对变量的拷贝原创 2016-05-12 01:10:45 · 33533 阅读 · 13 评论 -
字节序 —— 大端与小端
尾端(endianness)这一词由Danny Cohen引入计算机科学,Cohen注意到计算机体系结构依照字节寻址和整型数定义之间在通信系统的关系,被划分为两个阵营。例如,一个32位的整数会占据4个字节,这样会有两种合理的方式来定义整数和各个字节之间的关系:有些计算机先从低位字节开始存放,有些则先从高位字节开始存放,Cohen将它们分别称为“小端(little-endian)”和“原创 2017-11-30 00:19:33 · 2359 阅读 · 0 评论 -
Linux编程——终止线程的正常方式及取消点
问题背景: 在使用pthread_cancel和pthread_join退出一个线程时,线程本身会立即停止运行代码并退出吗?如果在你试图退出一个线程时,该线程中还有未释放的资源,这时应该怎么处理呢?在cancel一个线程时,线程体可能并不会立即退出,这就会出现两个问题:在调用cancel之后,如果线程体仍在运行,就会导致pthread_join()阻塞,进而使调用pthread_joi...原创 2017-11-30 12:33:21 · 11135 阅读 · 0 评论 -
GCC的built-in方法之 —— 原子操作
如果要在多线程中对同一个整型变量进行加减操作,我们知道可以通过加锁的方式保证线程同步,但仅对这一个变量加锁,是不是大材小用了?有没有类似于Linux内核中的atomic_inc()/atomic_dec()方法从指令的层面上实现操作变量的原子性?答案是,有的。GCC提供了一系列内置函数,来完成对一些简单的数据操作的同步。type __sync_fetch_and_add (type *ptr, ty原创 2017-11-27 20:38:14 · 3179 阅读 · 0 评论 -
同步、异步、阻塞、非阻塞,以及IO模型的理解
同步和异步同步 就是你知道你什么时候在做什么,做完一件事情再做下一件事情,因此主动权在自己手里。比如通过等待或轮询,你在某个时间点总是知道结果是怎样的(有数据还是没数据等)。 异步 就是你不知道什么时候会发生什么。比如你注册了多个回调函数,你不知道什么时候会被调用以及被调用的是哪一个回调函数。阻塞和非阻塞阻塞:一个调用过程必须完成才返回。对于IO操作,如果IO没有准备好,读取或...原创 2018-01-24 19:48:32 · 3977 阅读 · 0 评论 -
Linux中的字符串和字节序列处理函数
花了两天的时间总结了Linux编程时的字符串操作函数和字节序列操作函数,以便后续查阅。这些函数大都不会去检查传入的参数是否为NULL,因此在使用之前要自己做检查,否则后果你懂的。一个基本知识点: 字符串处理中,如strcpy,字符串都是以’\0’来判断结束的。 字节序列处理中,如memcpy,操作内存字节,不在乎’\0’或其他字符。下列函数基本都包含在头文件string.h中,如果...原创 2018-04-24 19:19:01 · 628 阅读 · 0 评论 -
offsetof 和 container_of 的用途
offsetof() 和 container_of() 两个宏定义在Linux内核中很常见。我们在应用程序编程时可能也需要用到,因此可以把这两个宏定义copy过来。offsetof(type, member)用来求结构体type中的member成员在type中的偏移, 其定义如下:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE ...原创 2018-04-24 19:21:06 · 616 阅读 · 0 评论 -
指针、数组、数组指针、函数指针
1.数组和指针的大小对于指针,无论它指向何种类型(int、char或是结构体等类型),指针自身总是占用4个字节(32位的long型大小),因为指针和它指向的内容是分离开的,指针本身只保存实际内容的地址,因此其大小就是系统地址范围的大小。 对于数组,其本身就是用在存放实际内容的,因此它的大小就是这个数组实际需要的内存大小,例如数组 short score[6]; 就是定义了一个包含6个shor...原创 2018-05-02 18:56:44 · 337 阅读 · 0 评论 -
stdout行缓冲和stderr无缓冲的含义
stdout和stderr有人说stdio是带缓冲的,stderr是不带缓冲的,这并不是指fd=1和fd=2这两个设备文件,这两个设备是字符设备,本身没有缓存。并且你看一个进程的1和2两个fd指向的其实是同一个终端设备文件:[root@ubuntu]arm-code:$ ls -l /proc/8669/fd/total 0lrwx------ 1 root root 64 4月...原创 2018-06-24 22:57:25 · 2551 阅读 · 0 评论 -
exit() 和 _exit() 的区别
exit()和_exit()的效果都是让程序退出执行,而_exit()用来“尽快”退出。atexit()先说一下atexit()函数。我们可以用atexit()注册一个或多个函数退出清理函数(或者on_exit()但这个函数不建议用),这些清理函数按照注册时的反顺序,在exit()或main函数return时被调用。#include <stdlib.h>int a...原创 2018-06-24 22:58:55 · 1254 阅读 · 0 评论 -
Linux sed命令的用法介绍
sed命令简介sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处原创 2017-01-02 00:44:37 · 14294 阅读 · 3 评论 -
GCC的__attribute__ ((constructor))和__attribute__ ((destructor))
gcc允许为函数设置__attribute__ ((constructor))和__attribute__ ((destructor))两种属性,顾名思义,就是将被修饰的函数作为构造函数或析构函数。程序员可以通过类似下面的方式为函数设置这些属性: void funcBeforeMain() __attribute__ ((constructor)); void funcAfterMain() __attribute__ ((destructor));带有(constructor)属性的函数将在main原创 2015-03-08 22:21:24 · 5994 阅读 · 0 评论 -
Linux Kernel Documentation kbuild modules
内核源码目录下的Documentation/kbuild/modules.txt文件,详细介绍了模块的编写和编译的方法技巧。In this document you will find information about:- how to build external modules- how to make your module use the kbuild infrastru转载 2015-04-12 12:41:17 · 1785 阅读 · 0 评论 -
Linux内核模块的编写方法和技巧
内核模块可以在不重新编译内核的情况下添加到内核代码中运行,其可以动态加载和卸载,因此可以根据需要将内核某些功能独立出来作为模块,而不是编译到内核中,这样可以减少内核大小,并且可以按照实际需求选择裁剪或添加某些内核功能。1. 编写一个内核模块需要先强调一个最基本的知识,内核模块是要运行在内核态的代码,所以编写内核模块需要包含的头文件都是内核中的头文件,使用的函数都是内核的函数。编写一原创 2015-04-12 12:44:46 · 4033 阅读 · 0 评论 -
gcc的__builtin_函数介绍
GCC提供了一系列的builtin函数,可以实现一些简单快捷的功能来方便程序编写,另外,很多builtin函数可用来优化编译结果。这些函数以“__builtin_”作为函数名前缀。很多C标准库函数都有与之对应的GCC builtin函数,例如strcpy()有对应的__builtin_strcpy()内建函数。下面就介绍一些builtin函数及其作用:__builtin原创 2015-04-08 23:02:19 · 46959 阅读 · 6 评论 -
linux内核中的likely()和unlikely()宏的作用
在看linux内核代码的时候,经常会看到likely(x)和unlikely(x)宏的使用。那这两个宏有什么作用呢?这两个宏在内核中的定义如下:# define likely(x) __builtin_expect(!!(x), 1)# define unlikely(x) __builtin_expect(!!(x), 0)可见这里使用了gcc的内建函数__builtin_exp原创 2015-04-10 00:16:17 · 19087 阅读 · 0 评论 -
C语言中的二级指针(1) -- 值传递问题
先看一个我们非常熟悉的代码:#include void swap(int a, int b){ int tmp; tmp = a; a = b; b = tmp;}int main(){ int a = 3, b = 5; swap(a, b); printf("a = %d, b = %d\n", a, b); return 0;}我们都知道,这段代码中的s原创 2015-04-25 22:54:51 · 3133 阅读 · 1 评论 -
本地socket(unix domain socket)
原博出处未知,故无法贴出,原作者烦请告知。socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号转载 2015-05-10 13:15:48 · 4981 阅读 · 0 评论 -
backtrace函数的使用
backtrace()是glibc(>=2.1)提供的函数,用于跟踪函数的调用关系。以下对backtrace()函数的说明以及实例,都来自其man page。函数定义 #include int backtrace(void **buffer, int size); char **backtrace_symbols(void原创 2015-03-07 00:11:09 · 13768 阅读 · 1 评论 -
linux编程 - 给线程起名字
通过prctl给线程起名为了能方便的区分一个进程中的每个线程,可以通过prctl()给每个线程取个名字。这样在会创建多个线程的程序执行过程中,就能知道一个pid或tid对应的是哪个线程。prctl是个系统调用,可以用来读取和更改一个线程的属性。其用户态接口定义如下:#include int prctl(int option, unsigned long arg2, unsigned原创 2016-05-09 01:09:23 · 19275 阅读 · 0 评论 -
ARM Linux中的非对齐内存访问(Alignment trap警告的原因)
介绍ARM Linux中进行编程时非对齐内存地址访问时需要注意的问题,以及Alignment trap警告的原因。原创 2016-06-04 22:12:05 · 16142 阅读 · 0 评论 -
C语言中的二级指针(2) -- 链表操作
一个链表中所有元素通过指针串联起来,链表的插入、删除等操作都是对指针的操作。使用指针操作链表例如,下面的代码段实现了一个删除链表节点的函数,很多人都会采用类似的代码删除链表节点。/* 结构体定义 */struct testdata{ struct testdata * next; //指向链表下一个节点的指针 int id;};/* 链表头 */struct testd原创 2015-04-25 22:38:57 · 5993 阅读 · 2 评论 -
tcmalloc的使用问题
tcmalloc能用作内存池,优化malloc和线程分配内存的效率。它是gperftools的一员,gperftools还提供了heap-checker,heap-profiler和cpu-profiler三个工具。源码下载:https://github.com/gperftools/gperftools编译完后就可以使用tcmalloc库了:-ltcmalloc-ltcmalloc_m...原创 2018-10-03 15:26:07 · 2980 阅读 · 0 评论