![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 68
yk__peng
用心生活。。。
展开
-
GCC编译过程分解
出处http://blog.chinaunix.net/uid-20196318-id-28797.html以helloworld为例分析gcc编译过程:#include int main(){ printf(“Hello World\n”); return 0;}通常我们使用gcc来生成可执行程序,命令为:gcc he转载 2013-05-04 12:35:55 · 697 阅读 · 0 评论 -
binutils工具集,软件开发利器
如果使用gcc编译器,那么在开发中就离不开使用与之配套的工具集(tool chain),即binutils。工具集中的部分工具除了被gcc在后台使用为我们创建程序文件之外,其他则有助于方便开发和调试.在binutils工具集中,以下工具是我们在做嵌入式软件开发时需要掌握的。·as是汇编编译器,用于将汇编代码转换为目标文件。·addr2line用于得到程序指令地址所对应的原创 2013-09-24 11:18:47 · 1752 阅读 · 0 评论 -
Linux性能评测工具之gprof
1 简介改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数消耗掉了大部分执行时间,这通常都不是非常明显的。GNU 编译器工具包所提供了一种剖析工具 GNU profiler(gprof)。gprof 可以为 Linux平台上的程序精确分析性能瓶颈。gprof精确地给出函数被调用的时间和次数,给出函数调用关系。gprof 用户手册网站 http://sour转载 2013-12-29 10:05:51 · 781 阅读 · 0 评论 -
关于结构体内存对齐
内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型转载 2014-03-04 16:43:45 · 717 阅读 · 0 评论 -
pthread_cleanup_push()/pthread_cleanup_pop()
编译结果:[yk_peng@pengyangkang work]$ gcc test.c -pthreadtest.c: 在函数‘fn’中:test.c:38:1: 错误:expected ‘while’ at end of inputtest.c:38:1: 错误:expected declaration or statement at end of inputtest.c:原创 2015-03-13 17:01:46 · 573 阅读 · 0 评论 -
IO复用,select、poll、epoll综述
如果不希望进程在对文件描述符执行I/O操作时被阻塞,我们可以创建一个新的进程来执行I/O。此时父进程可以去执行其他的任务,而子进程将阻塞直到I/O操作完成。如果我们需要处理多个文件描述符上的I/O,那么需要为每个文件描述符创建一个子进程。这种方法的问题在于开销昂贵且复杂。创建及维护进程对系统来说都是开销,而且一般来说子进程需要使用IPC机制来通知父进程有关I/O操作的状态。 如果使用原创 2015-08-11 15:24:47 · 834 阅读 · 0 评论 -
理解make的解析行为
第一阶段:make读入所有的makefile,以及makefile中所包含的其他makefilemake分析并获取变量名,变量值,隐式规则和显示规则构建所有目标的关系树,以及他们的先决条件第二阶段:接着就是执行命令了(基于第一阶段的关系树,确定需要重新构建的目标)理解make处理makefile的两个阶段对于熟练地编写makefile非常重要。makef原创 2013-10-30 21:02:19 · 1032 阅读 · 0 评论 -
不完全类型
不完全类型指“函数之外、类型的大小不能被确定的类型”原创 2014-09-28 13:29:38 · 911 阅读 · 0 评论 -
仅运行一个程序的单个实例
一些程序,特别是很多的daemon,需要确保同一时刻只有一个程序实例在系统中运行。完成这项任务的一个常见方法是:使用记录锁。 让daemon创建一个文件并在该文件上放置一把写锁。daemon在其执行期间一直持有这个文件锁并在即将终止之前删除这个文件。如果启动了daemon的另一个实例,那么它在获取该文件上的写锁时就会失败,其结果是它会意识到daemon的另一个实例肯定正在运行,然后终原创 2015-08-11 16:33:46 · 1220 阅读 · 0 评论 -
Posix线程私有数据
在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问. 我们想想使用什么方法可以做到这一点。1.全局变量为进程中所有线程可见,是否有方法可以缩小其可见度,使其只在某个线程中可见2.函数模块中的自动变量原创 2015-08-11 16:16:58 · 573 阅读 · 0 评论 -
UTC时间、GMT时间、本地时间、Unix时间戳
UTC: Universal Time Coordinated 协调世界时,又称世界标准时间。GMT: Greenwich Mean Time 格林尼治平均时。UTC与GMT:UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示这两者几乎是同一概念。它们都是指的格林尼治标准时间,只不过UTC的称呼更为正式一点。两者的区别在于转载 2016-01-19 21:33:41 · 10103 阅读 · 0 评论 -
C++ linux线程安全单例Singleton
DCL(double checked locking)//class singleton//:s1-singleton* get_instance(void){ lock(); if( instance == 0) { instance = new singleton; } unlock(); return inst原创 2016-07-03 16:15:42 · 862 阅读 · 0 评论 -
创建单实例守护进程
点击打开链接在UNIX环境高级编程(APUE)中提到了守护进程的创建方法,思路很清晰,所以这里通过代码具体研究下。1 完整程序:单实例守护进程根据APUE的介绍,创建守护进程基本需要如下7个步骤。需要注意的是由于守护进程没有TTY(控制终端),所以代码中部分特意写上去的printf语句是不会输出到终端界面上的。 1 2转载 2016-12-19 21:50:53 · 784 阅读 · 0 评论 -
透彻 Linux (Unix) 五种 IO 模型
IO模型 用一幅图表示所支持的I/O模型纵向维度是“阻塞(Blocking)”、“非阻塞(Non-blocking)”;横向维度是“同步”、“异步”。总结起来是四种模型 同步阻塞、同步非阻塞;异步阻塞、异步非阻塞 。《Unix网络编程》中划分出了“第五种”模型——“信号驱动式IO”其实属于异步阻塞类型,这种模型的通知方式有多种多样后面展开说明。同步/异步、阻转载 2017-01-17 13:51:58 · 5769 阅读 · 1 评论 -
SO_REUSEADDR和SO_REUSEPORT异同
http://blog.chinaunix.net/uid-28587158-id-4006500.html文章内容来源于stackoverflow上的回答,写的很详细http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-转载 2017-03-14 10:31:48 · 607 阅读 · 0 评论 -
实用的gcc选项
1.获取系统头文件搜索路径:gcc -v 有效C源文件2.产生映射文件:除了实用nm工具外,可以在用gcc命令时,用-wl传递参数给连接器ld产生映射文件gcc -wl,-Map=main.map main.c -o main.exe3.定义宏:gcc -D'GREET=2' main.c -o main.exe相当于#define原创 2013-09-24 10:30:14 · 1127 阅读 · 0 评论 -
gcc如何获取系统头文件路径
使用命令:gcc -v main.c也就是gcc -v 有效C源文件注意-v后面要加有效C源文件后,输出信息才包含系统头文件路径gcc -v的输出:使用内建 specs。COLLECT_GCC=/usr/bin/gccCOLLECT_LTO_WRAPPER=/usr/libexec/gcc/i686-redhat-linux/4.5.1/lto-wrapper目标:i6原创 2013-09-24 08:31:23 · 3488 阅读 · 0 评论 -
寄存器的分配
编译器会试图对C函数中的每个局部变量分配一个寄存器。如果几个局部变量不会交叠使用,编译器会对他们分配相同的寄存器。当局部变量多于可用的寄存器时,编译器会使用堆栈存放这些变量。ARM Thumb过程调用标准ATPCS:R0~R3用于传参,RO用于返回值R4~R11通用变量寄存器R12临时过渡寄存器R13堆栈指针R14连接寄存器R15 PC转载 2013-06-11 20:13:45 · 872 阅读 · 0 评论 -
ARM C编译器的数据类型映射
转载 2013-06-11 18:43:44 · 736 阅读 · 0 评论 -
[gcc核心扩展]关于gcc中的typeof以及其他
(使用以下扩展可能需要使用-gnu99) GNC CC是一个功能非常强大的跨平台C编译器,它对C 语言提供了很多扩展,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把支持GNU 扩展的C 语言称为GNU C。 Linux 内核代码使用了大量的 GNU C 扩展,以至于能够编译 Linux 内核的唯一编译器是 GNU CC,以前甚至出现过编译 L转载 2013-06-08 17:00:33 · 1502 阅读 · 0 评论 -
[Linux/Unix C 编程] perror函数,strerror函数,errno
void perror(const char *s); perror ("open_port");函数说明perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你原创 2013-09-10 10:24:19 · 5472 阅读 · 0 评论 -
ssize_t与size_t的前世今生
Ssize_t 与size_t跟踪linux源码得到以下宏: #ifndef _SIZE_T#define _SIZE_Ttypedef __kernel_size_t size_t;#endif #ifndef _SSIZE_T#define _SSIZE_Ttypedef __kernel_ssize_t ssize_t;转载 2013-09-10 09:53:06 · 1466 阅读 · 0 评论 -
嵌入式软件编译链接
每个目标文件是独立编址的,也就是说每个目标文件(*.o)的第一条指令都从相同的地址开始存放。连接器的作用:1.将多个目标文件或库文件按照各文件中段进行统一编址。2.生成一个完整的统一的地址印象。3.嵌入式系统中一般生成一个绝对地址印象(非PIC)。4.在有MMU的系统中可以为每个任务单独分配一个地址空间。转载 2013-06-09 22:33:56 · 1135 阅读 · 0 评论 -
嵌入式开发必须要懂的
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实转载 2013-05-04 15:10:47 · 1059 阅读 · 0 评论 -
C与汇编混合编程
C与汇编之数据交流:可以使用全局变量实现。在C中声明全局变量后,在汇编程序中使用IMPORT+全局变量名,导入全局变量,之后可以在汇编中使用这个全局变量了。C调用汇编中的函数:1.在汇编程序中使用EXPORT导出函数名。2.在C中是用extern关键字声明汇编中的函数。汇编中调用C中定义的函数:在汇编函数中使用IMPORT+(C中定义)函数名(之后可以使用B+函数名跳转)。原创 2013-04-24 20:13:41 · 851 阅读 · 0 评论 -
如何从标准c语言定义得到传统c语言库函数定义
1.消除任何使用标准c语言类型的函数,如long long与_Complex,或消除标准c语言中新增的函数(C89或C99).2.删除限定符const、restrict与volatile3.删除数组声明符括号内使用的static.4.将类型void * 换成char * ,将size_t换成int。C语言的发展历史大致上分为三个阶段:Old Style C、C89、C99转载 2013-04-17 22:07:11 · 708 阅读 · 0 评论 -
a.out
A.out-----“assembler output(汇编程序输出)”的缩写形式a.out是早期UNIX系统使用的可执行文件格式,由AT&T 设计,现在基本上已被ELF 文件格式代替.a.out文件包含7 个section,格式如下:1.exec header(执行头部,也可理解为文件头部)2.text segment(文本段)3.data s转载 2013-04-17 21:53:58 · 594 阅读 · 0 评论 -
Valgrind
Valgrind包括如下一些工具:Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。Callgrind。它主要用来检查程序中函数调用过程中出现的问题。Cachegrind。它主要用来检查程序中缓存使用出现的问题。H原创 2013-09-12 09:12:47 · 934 阅读 · 0 评论 -
派生类型(sys/types.h)
派生类型:使用系统派生类型有助于使代码对于 32 位和 64 位均安全,这是由于派生类型本身对于 ILP32 和 LP64 数据模型均安全。通常,使用派生类型以便于更改是良好的编程做法。如果数据模型在将来发生变化,或者在移植到其他平台时,只需更改系统派生类型即可,而无需更改应用程序。 文件 头文件中包含大量应在适当时机使用的基本派生类型。特别是以下几转载 2013-09-12 20:34:26 · 923 阅读 · 0 评论 -
Linux程序设计: 会话(session)
会话4. 名称::setsid功能:建立一个会话头文件:#include函数原形:pid_tsetsid(void);参数:无返回值:若成功则返回进程组ID,若出错则返回-1。转载 2013-09-13 16:26:47 · 2641 阅读 · 0 评论 -
链接时产生Map文件作用和必要性
可以要求linker产生map文件(例如GNU Linker ‘ld’的-m参数),虽然每套编译工具产生map文件格式可能都不一样,但它的基本用途就是记录项目中每一个Symbol之LMA与VMA的对应关系。这个map文件很有用,我们可以从map文件中得到下列信息:·程序各区段的寻址是否正确·程序各区段的size,即目前存储器的使用量·程序中各个symbol的地址·各个symbol在原创 2013-09-18 10:23:32 · 2316 阅读 · 0 评论 -
unix网络编程基础接口
typedef unsigned short int uint16_t;typedef unsigned int uint32_t; typedef unsigned short int sa_family_t;typedef uint16_t in_port_t;typedef uint32_t in_addr_t; 通用套接字地址结构sockaddr,定义在so原创 2015-08-11 15:49:39 · 515 阅读 · 0 评论