![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux C
文章平均质量分 69
小世界追着大梦想
有梦想,总没错!
展开
-
Linux C笔记之 链接属性 详解
链接属性: 当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个实体? 标识符的链接属性决定如何处理在不同文件中出现的标识符。标识符的作用域与它的链接属性有关,但不相同。 链原创 2016-05-22 22:43:17 · 539 阅读 · 0 评论 -
快速编写“专家级”makefile(2.创建基本编译环境)
一、运用规则:先来创建 simple 项目的两个源程序:foo.c#include void foo(){ printf("This is foo ()!\n");}main.c#include extern void foo();int main(){ foo(); return 0;} 对于项目,在编写 Makefil原创 2016-07-21 17:57:59 · 832 阅读 · 0 评论 -
快速编写“专家级”makefile(3.提高编译环境的实用性)
首先创建一个 complicated 项目:complicated / foo.h#ifndef __FOO_H#define __FOO_Hvoid foo();#endifcomplicated / foo.c#include #include "foo.h"void foo(){ printf("This is foo ()!\n");}原创 2016-07-21 18:00:30 · 948 阅读 · 0 评论 -
浅谈内存泄漏与内存溢出的区别?
内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用,出现内存溢出; 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 内存泄露会最终会导致内存溢出! 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却原创 2016-08-18 21:50:31 · 422 阅读 · 0 评论 -
浅谈缓冲区溢出问题
缓冲区:程序运行时机器内存中的一块连续块,保存了给定类型的数据,随着动态分配变量出现问题。 缓冲区溢出:当缓冲区内填充数据位数超过了缓冲区自身的容量限制时,发生溢出的数据会覆盖在合法数据(数据、下一指令的指针、函数返回地址等)上的情况。最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度,由于大多数程序都会假设数据长度总是与所分配的储存空间相当,进而存在缓冲区溢出隐患原创 2016-08-18 22:49:02 · 1499 阅读 · 0 评论 -
new/delete 与 malloc/free 的区别
在 C++ 中,申请动态内存与释放动态内存,用 new / delete 与 malloc / free 都可以,而且它们的存储方式都相同,new / malloc 动态申请的内存都位于堆中,无法被操作系统自动回收,需要对应的 delete / free 来释放空间,同时对于一般的数据类型,如 int、char型,它们的效果都是一样的。 malloc / free 是 C /原创 2016-08-22 09:53:06 · 346 阅读 · 0 评论 -
虚拟内存与物理内存的区别
第一层理解 1.每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,转载 2016-08-22 10:00:50 · 3475 阅读 · 0 评论 -
快速区分 malloc calloc realloc
malloc: malloc() 在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址 用法:char *pt = (char *)malloc(sizeof(char *));relloc: calloc()与 malloc() 相似,参数sizeofE原创 2016-08-14 10:05:14 · 269 阅读 · 0 评论 -
linux 进程内存解析
之前我所了解的linux下进程的地址空间的布局的知识,是从APUE第2版的P430得来的,之后上网查了一些资料,大概弄了明白。一个linux进程分为几个部分(从一个进程的地址空间的低地址向高地址增长):1.text段,就是存放代码,可读可执行不可写,也称为正文段,代码段。2.data段,存放已初始化的全局变量和已初始化的static变量(不管是局部static变量还是全局static变量)转载 2016-08-14 11:27:32 · 275 阅读 · 0 评论 -
Shell常用命令整理大全
1、 ls: 类似于dos下的dir命令ls最常用的参数有三个: -a -l -F。ls –aLinux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示一般文件名外,连隐藏文件也会显示出来。ls –l该参数显示更详细的文件信息。ls –F使用这个参数表示在文件的后面多添加表示文件类型的符号,例如 * 表示可执行,/ 表示目转载 2016-08-14 11:44:08 · 418 阅读 · 0 评论 -
Sizeof与Strlen的区别与联系
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所转载 2016-08-14 14:33:39 · 318 阅读 · 0 评论 -
进程间通信机制有哪些?
进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 2.信号(signal): 信号量是一个计数器,可以用来控制多原创 2016-08-14 20:09:05 · 11057 阅读 · 0 评论 -
详解 C/C++中 extern 关键字
1 定义: extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。问题1 : extern + 变量 在一个源文件里定义了一个数组:char a[5]; 在另外一个文件里用下列语句进行了声明:extern char *a;请问,这样可以吗? 答案与分析: 1原创 2016-08-15 10:18:22 · 865 阅读 · 0 评论 -
前置运算符与后置运算符的区别
前置运算符:先取变量的地址,运算它的内容,然后把值放到寄存器中。后置运算符:先取变量的地址,把它的值装入寄存器中,在运算它内存中的内容。简而言之:前置是先算后用,后置是先用后算;#includeint main(){ int a,b,c,d; a = 10; b = a++; c = ++a; d = 10 * a++;原创 2016-08-15 10:44:40 · 6515 阅读 · 0 评论 -
进程的创建
进程的创建也就有两种方式:一是由操作系统创建,二是由父进程创建。在系统启动时,操作系统会创建一些进程,他们承担着管理和分配系统资源的任务,这些进程通常被称为系统进程。系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构。整个Linux系统的所有进程也是一个树形结构。树根是系统自动构造的,即在内核态下执行的0号进程,他是所有进程的祖先。由0号进程创转载 2016-10-07 10:08:11 · 2207 阅读 · 0 评论 -
快速编写“专家级”makefile(1.从最简单的Makefile中了解规则)
三个概念: 目标(target):指要干什么依赖关系(dependency):指目标所依赖的其他目标命令(command):指告诉 make 如何生成目标 规则的语法: targets:prerequisite command .... 第一个原创 2016-07-21 17:56:15 · 753 阅读 · 0 评论 -
C/C++面试题:static(静态)变量的作用
C /: static 的作用: (1)在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变 (2)在函数体外(但在模块内),它的作用域范围有限制,即如果一个变量被声明为静态的,那么该变量可以被模块内的所有函数访问,但不能被模块外其他函数访问。如果一个函数被声明为静态的,那么该函数与普通函数作用域原创 2016-07-21 17:54:02 · 3409 阅读 · 0 评论 -
深入理解程序的结构
程序是被分成段加以管理的,在程序被加载到内存中运行之前,各段是放在程序文件中的。 当程序文件中所需的段被加载到内存中后,将通过运行指令来处理相应的数据。有些数据来源于程序文件中的段,有些是自动生成的。1、段 1.1、指令段 .text 段: 由于处理器只能识别数据和指令。所以不论采用什么高级语言编写原创 2016-07-17 18:47:52 · 368 阅读 · 0 评论 -
C语言笔记之一 数组与函数篇(一)
1.在C语言中,数组参数是以引用形式进行传递的,也就是传址调用,而标量和常量则是按值传递的。 2.在C语言中,函数内对标量参数的任何修改都会在函数返回时丢失,因此,被调用函数无法修改调用函数以传值形式传递给它的参数。然而,当被调用函数修改数值参数的其中的一个参数时,调用函数所传递的数组就会被实际的修改。 3.在C语言中,不论调用函数的程序传递给它的数组参数的长度是多原创 2016-05-18 01:30:55 · 599 阅读 · 0 评论 -
告诉你为什么要选择C语言?
为什么C语言依然如此流行?历史上,由于种种原因,业界选择了C,其中最主要的原因在于它的效率。优秀的C程序的效率几乎和汇编语言程序一样高,但C程序明显比汇编语言程序更易于开发。和许多其他语言相比,C给予程序员更多的控制权,但也增加了出错的可能性。例如,C对数组下标应用和指针访问并不进行有效性检查,这可以节省时间,但你在使用这些特性时就必须特别小心。如果你在使用C语言时能够严格遵守相关规定,就可以避免这转载 2016-05-18 01:20:52 · 1834 阅读 · 0 评论 -
Linux C笔记之 作用域 详解
作用域: 当变量在程序的某个部分被声明时,它只有在程序的一定区域才能被访问。这个区域由标识符的作用域决定。 标识符的作用域就是程序中该标识符可以被使用的区域。 1.代码作用域: 位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域,表示它们可以被这个代码块中的所有语句访问。 当代码块处于嵌套状态时,声明于内层代码块的标识原创 2016-05-22 23:43:44 · 670 阅读 · 0 评论 -
Linux C笔记之 变量存储类型 详解
存储类型:变量的存储类型是指存储变量值的内存类型 ;变量的存储类型决定变量何时创建、何时销毁以及它的值将保存多久 ;存储变量:普通内存、运行时堆栈、硬件寄存器;变量的缺省存储类型取决于它的声明位置;静态(static)变量:在代码块之外声明的变量,存储于静态内存中,也就是不属于堆栈的内存。静态变量,无法为它指定其他存储类型。它在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非原创 2016-05-22 23:51:24 · 533 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境)
前面的 simple 和 complicated 项目都是采用了单一的目录结构,但大型的项目往往用多个目录来存放不同的模块。下面我们通过 huge 项目来模拟一个更加专业的编译环境。 下图说明了 huge 项目将采用的目录结构 从图中:huge 最上层有两个目录: build 和 codebuild 目录用于存放个 Makefile 文件间的共享文件原创 2016-07-22 13:21:33 · 581 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境——增进复用性)
可以将共用部分放入一个独立的文件中——这就是 build 目录下的 make.rule 文件的作用 那么,在 foo 模块的 Makefile 中,哪些是不能共用的呢?变量 EXE 和 LIB 的定义对于每一个软件模块是不同的DIR_EXES 变量和 DIR_LIBS 变量由于运用了相对路径,所以也是每个模块特有的。但是可以采用绝对路径的方式解决这个问题。比如,可以定原创 2016-07-22 13:22:57 · 523 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境——支持头文件目录的指定)
现将项目文件放入各目录中:huge / code / foo / inc / foo.h#ifndef __FOO_H#define __FOO_Hvoid foo();#endifhuge / code / foo / inc / foo.c#include #include "foo.h"void foo(){ printf("This is foo原创 2016-07-22 13:24:32 · 458 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境——实现库链接)
根据前面所运行结果,main.o 被正确地生成了,但在链接时因为找不到 foo() 函数的实现而出现错误。由于 foo() 函数的实现是放在 libfoo.a 库中的,而 Makefile 中并没有告诉编译器在生成 huge.exe 时需要与 libfoo.a 库链接在一起 huge / build / make.rule.PHONY : all cleanNKDIR原创 2016-07-22 13:25:30 · 402 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境——增强可使用性)
从前面看来,为了编译 huge 项目需要进入不同的目录运行 make ,我们可以简化它: huge / build / Makefile.PHONY : all cleanROOT = $(realpath ..)DIRS = $(ROOT)/code/foo/src\ $(ROOT)/code/bar/src\ $(ROOT)/code/huge/srcRM =原创 2016-07-22 13:26:23 · 730 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境——管理对库的依赖关系)
对于前面的 Makefile , 当我们改动了 foo.c 文件时,会导致 libfoo.a 库的重新编译,但并没有使得 huge.exe 重新编译。原因是:我们只是指定了 huge.exe 生成时所需的库,并没有让 huge.exe 依赖于这些库文件,所以库文件的改动并不能使得 huge.exe 被重新编译 解决:前面提出, LINK_LIBS 已经指明了 huge.exe 生原创 2016-07-22 13:27:11 · 500 阅读 · 0 评论 -
快速编写“专家级”makefile(4.打造更专业的编译环境——改善编译效率)
对于大型项目,提高项目的编译速度有着非常重要的意义。 从 Makefile 中看,一个可以改善编译效率的地方与其中的隐式规则有关 隐式规则即:make 自带的编译规则,如生成 .o 文件的规则 %.o : %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $^ 而我们在前面原创 2016-07-22 13:28:06 · 336 阅读 · 0 评论 -
字节序与边界对齐
字节序: 32位处理器每次处理 4 个字节。 当数据类型大于1个字节时,其在内存中的顺序存在两种模式: (1)小端:低字节放在低地址 (2)大端:低字节放在高地址边界对齐: 边界对齐是处理器为了提高处理性能而对存取数据的起始地址所提出的一种要求。原创 2016-07-22 13:30:22 · 873 阅读 · 0 评论 -
快速搞懂 ”ld“ ——链接器
链接器的功能:将一个可执行程序所需的目标文件和库最终整合在一起。 一个程序包含三个段:.text 、.data 和 .bss 段。 而各目标文件和库都包含这三段,所以,ld 链接器的功能就是将各个目标文件和库的三段合并在一起。 当然,链接器所完成的链接工作并非只是简单地将各个目标文件和库的三段内存堆砌在一起,而是还要完成 “重定位” 的工作。原创 2016-07-22 13:33:05 · 11113 阅读 · 5 评论 -
快速理解 .bss、.data和.rodata
全局变量是放在全局内存中的,用static修饰的局部变量也是会放在放全局内存的,它的作用域是局部的,但生命期是全局的。全局强调的是它的生命期,而不是它的作用域,所以有时可能把两者的概念互换。一般来说,在一起定义的两个全局变量,在内存的中位置是相邻的。这是一个简单的常识,但有时挺有用,如果一个全局变量被破坏了,不防先查查其前后相关变量的访问代码,看看是否存在越界访问的可能。在ELF格式的可执原创 2016-07-12 13:53:35 · 17244 阅读 · 0 评论 -
快速编写“专家级”makefile(2.创建基本编译环境-使用功能”函数“)
1.abspath 功能:将 _names 中的各路径名转换成绝对路径 形式:$(abspath _names) 返回值:返回转换结果实例:.PHONY: allROOT:= $(abspath/usr/.../lib)all:@echo $(ROOT) 运行结果$make/原创 2016-07-21 17:59:04 · 925 阅读 · 0 评论