每个进程都运行在自己私有的内存空间中(即虚拟地址空间)。在32位系统中,4GB的进程地址东健被分为用户空间和内核空间两个部分。用户空间占据着 0~3GB(用16进制表示为0xC0000000),而内核空间的范围是3GB~4GB。对于一个进程而言,都会涉及3种不同的数据段,分别是代码段、 数据段和堆栈段。 代码段:用于保存可执行文件的操作指令和程序定义的常量。为了防止代码在运行的时候被其他进程修改,代码段将只允许读取,不能进行修改。多进程能够共享相同的代码段,即当程序被多次执行时,运行的相同程序将共享代码段。 数据段:其位置紧接着代码段,分为初始化数据段和未初始化数据段(也称为BSS段)。初.. Read More
posted @ 2014-04-01 07:48 thinker-lj Views(307) Comments(0) Diggs(0) Edit
众所周知,Linux下一切皆文件,文件包含数据,具有属性,通过目录中的名字被标识,可以从一个文件读取数据,写入另一个文件,而Linux把这写应用于设备。请看如下普通文件和设备的对比:第一列的c代表该设备是字符型设备,如果为块设备,则用b标识;重点是4,66这两个数字,这也是普通文件和设备的区别所在,对于普通文件,该列指文件大小,把设备视为文件是操作系统的一种抽象,所以,此处不可能真正显示其大小,其实设备文件的i-节点存储的是指向内核子程序的指针,而不是文件的大小和存储列表。内核中传输设备数据的子程序被称为设备驱动程序。在上图/dev/ttyS2这个例子中,4指代的是在设备-进程表中编号为4的子 Read More
posted @ 2014-03-31 20:18 thinker-lj Views(520) Comments(0) Diggs(0) Edit
typedef struct _Nameval {char *name;int value;} Nameval;Nameval htmlchars[] = {"AElig", 0x00c6,"Aacute", 0x00c1,/* ... */"zera", 0x03b6,};int lookpu(char *name, Nameval tab[], int ntab){ int low... Read More
posted @ 2014-03-22 17:32 thinker-lj Views(229) Comments(0) Diggs(0) Edit
1 void quicksort(int v[], int n) 2 { 3 int i, last; 4 if (n <= 1) /* nothing to do */ 5 return; 6 swap(v, 0, rand() % n); 7 last = 0; 8 for (i = 1; i < n; i++) 9 if (v[i] < v[0])10 swap(v, ++last, i);11 swap(v, 0, last);12 quicksort(v, last);1... Read More
posted @ 2014-03-22 07:06 thinker-lj Views(135) Comments(0) Diggs(0) Edit
C程序在内存中由以下几部分组成:正文段:这是由CPU执行的机器指令部分,通常情况下,正文段是可以共享的,子进程和父进程会共同维护内存中的一个副本;另外,正文段一般也是只读的,以防止程序由于意外而修改其本身;同时其中包含了只读的常量,比如字符串常量等。初始化数据段,即数据段:它包含了程序中已初始化的全局变量,属于静态分配内存;非初始化数据段,即bss段:这个名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,属于静态内存分配。在程序开始执行之前,内核将此段初始化为0;栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。借此,有了 Read More
posted @ 2014-02-19 01:02 thinker-lj Views(236) Comments(0) Diggs(0) Edit
一、main函数:先从程序的执行开始谈起,C程序总是从main函数开始执行,当内核执行C程序时(使用了一个exec函数),在调用main函数前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编辑器则由C编译器调用。启动例程从内核取得命令行参数和环境变量,然后为调用main函数做好安排。二、进程终止:有8种方式使进程终止,其中5种为正常终止,它们是:从main返回。调用exit。调用_exit或_Exit.最后一个线程从启动例程返回。最后一个线程调用pthread_exit。异常终止有3种方式,它们是:调用abort。接到一个信号并终止。 Read More
posted @ 2014-02-18 21:52 thinker-lj Views(176) Comments(0) Diggs(0) Edit
Linux将一切事物都看作文件,即便硬件设备在文件系统中也有相应的条目,用于与设备驱动程序进行通信的工具在过去就已经十分的常见,例如,hdparm可以用来配置一些磁盘参数,ifconfig可以报告网络统计信息。近年来,倾向于提供更一致的方式来访问驱动程序的信息。事实上,这种一致的方式甚至延伸到包括与Linux内核的各种元素的通信。Linux提供了一个特殊的文件系统procfs,它通常以/proc目录的形式呈现。该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层次的访问只要应用程序有正确的访问权限,它们就可以通过读写这些文件来获得信息或设置参数。/proc目录中的文件会随系统的不同而不 Read More
posted @ 2014-02-12 15:29 thinker-lj Views(958) Comments(0) Diggs(0) Edit
无论是运行简单的Linux桌面还是大型Linux服务器,都需要了解可供应用程序使用的空间,并跟踪系统的磁盘使用情况。下面介绍四个核心命令行命令来管理Linux系统上的介质环境。一、mount命令mount命令用于挂载介质,默认情况下,mount命令显示系统当前挂载的介质设备列表,如下图所示:上图仅列出来部分行,但足以清晰看出mount命令提供了4条信息:介质的设备位置;介质在虚拟目录中的挂载点;文件系统类型;已挂载介质的访问状态;要手动在虚拟目录中挂载介质设备,需要作为根用户登录。用于手动挂载介质设备的基本命令为: mount -t type device deirectorytype参数定义 Read More
posted @ 2014-01-23 19:13 thinker-lj Views(2484) Comments(1) Diggs(2) Edit
在LInux系统下,最困难的工作之一就是跟踪正在系统中运行的程序,尤其是现在,图形桌面使用很多的程序,只是为了生成一个桌面环境,系统中运行了太多的进程,幸运的是,有一些命令行工具可使这些任务轻松些,下面介绍四个基本工具:一、进程的查看:1.特定时间进程监控:ps默认情况下,ps命令不会显示太多的信息,只显示属于当前用户并且正在当前终端运行的进程,如下图:Linux系统中使用的GNU ps支持Unix类型参数、BSD类型参数、GNU长参数三种不同的命令行参数,下面只介绍Unix类型参数和示例:上面列出了许多参数,但请记住,这只是其中的一部分!使用ps命令的关键不是记住所有可用的参数,而是仅记住最 Read More
posted @ 2014-01-21 00:30 thinker-lj Views(5704) Comments(2) Diggs(4) Edit
偶然注意到在终端下花花绿绿的目录显示效果,开始以为只是些特效,后来研究了一下,原来其中有些规律性的东西,总结如下:蓝色表示目录:;浅蓝色表示链接:;红色表示压缩文件:;黄色表示设备文件:;绿色表示可执行文件:;带底纹表示目录对于所有用户有写权限:,等等还有很多不同颜色的不同含义;一、查看命令:dircolors,现实结果大体如下图所示:二、修改方式:在/etc目录下有个DIR_COLORS的文件,颜色的定义都在这里了,下图为该文件部分内容,其中下划线所在位置即为目录颜色的定义;数字含义,此文件前部分已给出,用户可以根据自己喜好修改; Read More
posted @ 2014-01-18 17:26 thinker-lj Views(2890) Comments(0) Diggs(1) Edit