随笔分类 -  linux C

摘要:http://witmax.cn/gdb-usage.html 首先GDB可以自动化调试,但是我不会 首先编译的时候要加上 -g选项 分屏使用GDB: gdb -tui 在GDB中加载程序 : file 文件名 设置参数: set args 参数 设置观察点(当有... 阅读全文
posted @ 2016-03-08 20:04 DChipNau 阅读(801) 评论(0) 推荐(0)
摘要:很简单的一个东西,但是感觉使用价值没有太大。实现了以下,结果如下: 执行到#error语句的时候直接停止编译,在下面输出设定好的错误信息。来自为知笔记(Wiz) 阅读全文
posted @ 2016-03-08 19:32 DChipNau 阅读(196) 评论(0) 推荐(0)
摘要:来自为知笔记(Wiz) 阅读全文
posted @ 2016-03-08 19:31 DChipNau 阅读(172) 评论(0) 推荐(0)
摘要:本文编辑整理自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471一、前言“联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说... 阅读全文
posted @ 2016-03-08 19:27 DChipNau 阅读(3429) 评论(0) 推荐(0)
摘要:普通情况: 调用函数参数的传递,是采取入栈的方式,先上图一张: Fun是被调用的函数,而为了演示其参数传递的过程,特意多设了几个参数,其传递参数的汇编代码如下: 可以看出,汇编代码中将这9个参数的前5个入栈,后几个直接通过寄存器来传递,而进入函数中出栈代码如下: 可以看出先出栈之后R0,R1,R2,R3(这四个不经过出栈入栈,直接通过寄存器传递),r5,r6,r7,r8,r12装载参数。 在实... 阅读全文
posted @ 2016-03-08 19:26 DChipNau 阅读(570) 评论(0) 推荐(0)
摘要:C语言可以使用alloc从栈上动态分配内存。 内存碎片Malloc/free或者new/delete大量使用会造成内存碎片,这种碎片形成的机理如下:内存碎片一般是由于空闲的内存空间比要连续申请的空间小,导致这些小内存块不能被充分的利用,举个例子:如果有100个单位的连续空闲内存,那么先申请3单元的连续内存,再申请50单元的内存,这时释放一开始的3单元的内存。这时,如果你一直申请比三单元大的内存单元... 阅读全文
posted @ 2016-03-08 19:24 DChipNau 阅读(4768) 评论(0) 推荐(0)
摘要:gcc 编译的四大过程(预处理-编译-汇编-链接 ) 我们来编译一个hello world 程序。#include int main(int argc,const char* argv[]){ printf("hello world!\n"); return 0;} 1)预处理(Pre-processing)在该阶段,编译器将C源代码中的包含的头文件如stdio.h编译进来,用... 阅读全文
posted @ 2016-03-08 19:23 DChipNau 阅读(986) 评论(0) 推荐(0)
摘要:Posix和system v区别 所谓的IPC(进程间通信)指的是消息队列,共享内存,信号量3种机制合并起来,当然,这是个狭义的概念,只包含这三种。IPC又可以分为system v进程间通信和posix进程间通信。下图说明了各种概念之间的关系。 IPC机制的作用范围是在整个系统,而不是仅限于进程,也就是说,一旦IPC对象被创建,除非显示的删除或者系统重启,否则对象一直存在,其中数据也保持不变。而进... 阅读全文
posted @ 2016-03-08 19:22 DChipNau 阅读(292) 评论(0) 推荐(0)
摘要:经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。 在程序代码中包含 #include ,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变... 阅读全文
posted @ 2016-03-08 19:21 DChipNau 阅读(1724) 评论(0) 推荐(0)
摘要:C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段)。如下图所示:1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。2.堆区(heap):一般由程序员释放,若程序员不释放,则可能会引起内存泄露。 注:1)堆和数据结构中的堆栈不一样,其类... 阅读全文
posted @ 2016-03-08 19:19 DChipNau 阅读(704) 评论(0) 推荐(0)
摘要:线程安全终止 取消一个线程的方式是向其发送pthread_cancel信号。目标线程接收到这个信号之后会采取动作,具体的动作取决于线程开始时以下几个函数的设定: 1)Int pthread_setcancelstate(int state,int * oldstate); 这个函数用来设定本线程对cancel信号反应,state有两种值:PTHREAD_CANCEL_ENABLE。分别表示收到信... 阅读全文
posted @ 2015-12-13 21:24 DChipNau 阅读(215) 评论(0) 推荐(0)
摘要:函数调用的细节实现这个问题当时感觉答得还可以,不过很多细节记不清晰了。所以下面反汇编一段小程序,进行分析,因为我比较熟悉的是arm汇编,所以我选择了一台安装了交叉工具链的ubuntu,而没有使用之前的centos。所以可能画风会有些不同。下图是我写了一个简单的程序和makefile。程序中是由main函数调用fun()函数。 编译程序,生成可执行文件,并对其进行反汇编,将反汇编之后的信息写入dum... 阅读全文
posted @ 2015-12-13 21:10 DChipNau 阅读(461) 评论(0) 推荐(0)
摘要:条件语句中使用到了三个关键字:“ifeq”、“else”和“endif”。其中:1. “ifeq”表示条件语句的开始,并指定了一个比较条件(相等)。之后是用圆括号括包围的、使用逗号“,”分割的两个参数,和关键字“ifeq”用空格分开。参数中的变量引用在进行变量值比较时被展开。“ifeq”之后就是当条... 阅读全文
posted @ 2014-07-26 21:31 DChipNau 阅读(3197) 评论(0) 推荐(0)
摘要:linux下结构体 默认的是4字节对齐,总结了下,其规则如下:1 ,每个数据成员的存储地址是该成员大小与齐值中小的那个的整数倍。2,结构体的总大小必须是其内部最大成员的整数倍。gcc 只支持1,2,4对齐,所以当结构体里含有duoble的8字节成员不能套用以上规则。 阅读全文
posted @ 2014-07-25 12:01 DChipNau 阅读(210) 评论(0) 推荐(0)