![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux系统编程
文章平均质量分 89
虎哥的世界
Linux技术专家、嵌入式软件专家、数码爱好者、枝术宅
展开
-
跟我一起学Linux系统编程007-C语言变量分配、堆内存分配,函数可重入
1 C语言内存分配方式在Linux系统上,程序被载入内存,时成为进程之时,内核为用户进程地址空间建立了代码段、数据段和堆栈段,各种C语言代码中需要占用空间的变量、常量也获得了内存空间。从进程内存布局上来讲C语言全局变量、局部变量、动态内存和常量对应的区域,分别对应以下四个区域。(1)静态存储区域分配。程序编译的时候就已经分配好,进程启动后获得实际的内存空间。这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2)在栈上分配。进程运行,函数压栈后,函数内部声明定义的局部变...原创 2021-10-19 11:35:49 · 291 阅读 · 0 评论 -
跟我一起学Linux系统编程006C-进程内存分配,堆分配brk、malloc、free
上上个记录《Linux系统编程006A-进程、内存布局》,上一个记录《Linux系统编程006B-进程内存布局、mmap调用、环境变量》中,主要是讲解了三件事:(1)进程与程序的区别(2)Linux进程内部的内存布局(3)Linux的整体虚拟地址的机制。本文要讲第四件事:进程的内存分配。1 Linux进程内存布局的要点回顾:(1)每个进程的虚拟地址空间分布Linux使用虚拟地址空间,大增了进程的寻址空间,一个进程由低地址到高地址分别为:1 保留段:从0开始到0x08048000这一段。...原创 2021-10-17 15:34:54 · 470 阅读 · 0 评论 -
跟我一起学Linux系统编程006B-进程内存布局、mmap调用、环境变量
1 进程内存布局下图是一个32位Linux进程的内存空间分布图。(1)保留区从0开始到0x08048000这一段,属于保留区。实际上,这部分并不是个单一的内存区域,而是禁止用户进程访问的地址区域的总称,这段地址空间中受到操作系统保护。如果这段内存区能操作的话,你的C代码中的空指针NULL也就合法了。所以,大多数操作系统中,极小的地址通常都是不允许访问的。C语言将无效指针赋值为0(NULL)也是出于这种考虑,因为0地址上正常情况下不会存放有效的可访问数据。(2)代码段(tex...原创 2021-10-05 18:30:46 · 256 阅读 · 0 评论 -
跟我一起学Linux系统编程006A-进程、内存布局
1 进程和程序可执行的文件,躺在硬盘上的叫程序,运行起来了就叫进程。从内核 的层面来看,进程由用户内存空间和一系列内核数据结构组成。其中,用户内存空间包含了程序代码和代码使用的变量,内核数据结构用于维护进程的状态信息。这些记录在内核数据结构的信息有:进程标识号IDs、虚拟内存表、打开文件描述符表、信号传递及处理的相关信息、进程资源使用和限制、当前工作目录、环境变量、命令行等等大量的相关信息。2 进程号和父进程号定义在”<stdlib.h>“中的系统调用函数getpid()、g..原创 2021-10-05 18:22:27 · 159 阅读 · 0 评论 -
跟我一起学Linux系统编程005-原子操作与竞争条件、向文件尾部追加数据
我们写的程序,如果在Linux平台上只运行一个实例,且只有一个线程,基本上我们不用关心这个问题,open文件,read读write写文件,一切会按步就班的发生,不会有什么问题。可这毕竟不是现实。现实是程序可能运行多个实例,一个实例可能有多个线程。特别是一些在线服务器程序,极有可能某个文件在同一时刻,被成千上万个read/write请求暴击,每个请求都争着获得它所需要的文件,多个进程或线程产生了竞争现象。并发与负载均衡,本文不谈这类高大上的话题,单从系统编程的角度来看等这件事。1 原子操作与竞争...原创 2021-10-05 18:17:30 · 143 阅读 · 0 评论 -
跟我一起学Linux系统编程004-文件描述符、文件IO、C库IO
我们知道了,在Linux系统上,一切皆文件。如果要在Linux系统上编程操作文件,则一定离不开文件描述符的概念。关于文件描述符概念的理解,在我的两个浅文《Linux系统编程笔记-文件描述符》和《Linux Shell脚本攻略-重定向理解与补充》都有提及。虽然啰嗦的我都想吐,但为了文意连贯,有助于理解,还不得不次重复一下要点。关于Linux文件、文件描述符和标准文件描述符Linux中标准文件描述符要点如下:在Linux中,一切都是文件。屏幕是文件,键盘是文件,系统错误也被抽象成了一..原创 2021-10-04 17:55:41 · 159 阅读 · 0 评论 -
跟我一起学Linux系统编程003-系统调用、API、标准C库
1 系统调用概述计算机系统的各种硬件资源比较有限,运行在操作系统之上的多个进程都需要访问这些资源,并且试图独占这些资源。如果进程都能随心所欲地问这些资源,冲突再所难免,系统塴溃就会时常产生。所以为了更好地管理,操作系统是不能允许进程直接操作这些硬件资源的。进程如果要想访问这些资源,必须向操作系统申请。进程向操作系统申请的入口就是系统调用(System Call),它由操作系统提供。在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口。2 A...原创 2021-10-01 19:08:46 · 557 阅读 · 0 评论 -
跟我一起学Linux系统编程学习002-一切皆文件、文件系统、IO
1 Linux系统的设计优点上个世纪六十年代,贝尔实验室Ken Thompson发明了UNIX,Dennis Ritchie参与了开发。在吸取了远古 Multics 操作系统研发中的失败经验后,里奇将UNIX的设计原则定为Keep it simple & stupid(大道至简)。UNIX 的特点:-所有的事物(甚至硬件本身)都是一个的文件,Everything (including hardware) is a file -以文本形式储存配置数据,Configuratio...原创 2021-10-01 18:58:57 · 207 阅读 · 0 评论 -
跟我一起学习Linux系统编程001-架构、内核概要
了解Linux系统架构、内核、基本原理,才是进入Linux平台下编程学习的前提。不了解这些,调用C/C++库来开发,可能表面上会学用一些库函数接口,实则可能是代码处处缺陷,一旦遇到有点深度的故障,程序开发寸步难行。1 Linux的分层架构不管是Linux、Windows,还是其它的操作系统,采用分层结构模型,这几乎是一个通行做法了。不仅是大系统,小的嵌入式系统,往往程序员也会不由自主地采用分层模型,就像上面的图上所示,通常的操作系统会分为这样几层:硬件层、系统层和应用层。系统层内部一般情况下..原创 2021-10-01 18:50:07 · 188 阅读 · 0 评论 -
Linux平台下自创c函数库及库的命名约定
如下所示,一段的简单到不能再简的程序:我们可以重新查看这个小程序,在这个程序中并没有定义”printf”的函数实现,且在预编译中包含进的”stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,Gcc会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数”printf”了,而这也就是链接的作用。...原创 2021-10-01 18:25:26 · 283 阅读 · 0 评论