摘要: 前两天看程序,发现在某个函数中有下面这段程序:int n; //define a variable nint array[n]; //define an array with length n在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量。例如下面这样int array1[10]; //validint const N = 10;int array2[N]; //validint n = 10;int array3[n]; //i... 阅读全文
posted @ 2013-10-27 10:18 hazir 阅读(13645) 评论(11) 推荐(5) 编辑
摘要: 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。Core Dump 名词解释在半导体作为电脑内存材料之前,电脑内 阅读全文
posted @ 2013-10-22 15:09 hazir 阅读(69171) 评论(2) 推荐(13) 编辑
摘要: Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动。僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸。配图源自Flickr僵尸进程如何产生的?如果一个进程在其终止的时候,自己就回收所有分配给它的资源,系统就不会产生所谓的僵尸进程了。那么我们说一个进程终止之后,还保留哪些信息?为什么终止之后还需要保留这些信息呢?一个进程终止的方法很多,进程终止后有些信息对于父进程和内核还是很有用的,例如进程的ID号、进程的退出状态、进程运行的CPU时间等。因此进程在终止时,回收所有内核分配给它的内存、关闭它打开的所有文件 阅读全文
posted @ 2013-10-18 08:47 hazir 阅读(30796) 评论(8) 推荐(4) 编辑
摘要: Linux 内核使用task_struct数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。该数据结构在内核文件include/linux/sched.h中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这里我不可能逐项去描述其表示的含义,本篇文章只关注该数据结构如何来组织和管理进程ID的。进程ID类型要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型:PID:这是 Linux 中在其命名空间中唯一标识进程而分配给它的一个号码,称做进程ID号,简称PID。在使用 f 阅读全文
posted @ 2013-10-03 16:08 hazir 阅读(22204) 评论(7) 推荐(9) 编辑
摘要: 前几天看内核中系统调用代码,在系统调用向量表初始化中,有下面这段代码写的让我有点摸不着头脑:const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { /* * Smells like a compiler bug -- it doesn't work * when the & below is removed. */ [0 ... __NR_syscall_max] = &sys_ni_syscall,#include };咱先不管上面代码的意思,先来回顾一下 C 语言中数组初始化的相关知识,然后... 阅读全文
posted @ 2013-09-26 18:57 hazir 阅读(4110) 评论(10) 推荐(6) 编辑
摘要: 系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。下面介绍Linux 下三种发生系统调用的方法:通过 glibc 提供的库函数glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 API(Application Programming Interface),除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的 阅读全文
posted @ 2013-09-22 12:21 hazir 阅读(25835) 评论(1) 推荐(4) 编辑
摘要: Linux 下使用sudo命令,可以让普通用户也能执行一些或者全部的 root 命令。本文就对我们常用到 sudo 操作情景进行简单分析,通过一些例子来了解 sudo 命令相关的技巧。情景一:用户无权限执行 root 命令普通用户登录 shell 之后,如果自身没有权限访问某个文件或执行某个命令时,若该用户获得root授权,那么就可以在需要执行的命令之前加上 sudo,临时切换到root用户的权限,完成相关的操作。在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码,而sudo使一般用户不需要知道超级用户的密 阅读全文
posted @ 2013-09-20 22:34 hazir 阅读(9481) 评论(0) 推荐(5) 编辑
摘要: 我们习惯在SI(Source Insight)中阅读Linux内核,SI会建立符号表数据库,能非常方便地跳转到变量、宏、函数等的定义处。但在处理系统调用的函数时,却会遇到一些麻烦:我们知道系统调用函数名的特点是sys_×××,例如我们想找open函数的内核系统调用代码,在SI提供的符号表中搜索sys_open,能找到函数的声明:asmlinkage long sys_open(const char __user *filename, int flags, umode_t mode);原本SI提供从函数名按住Ctrl单击鼠标左键能跳转到定义处的功能,但运用在系统调用 阅读全文
posted @ 2013-09-19 22:12 hazir 阅读(4707) 评论(0) 推荐(1) 编辑
摘要: systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工具,后续将会有系列文章介绍systemtap的用法。什么是systemtap假如现在有这么一个需求:需要获取正在运行的 Linux 系统的信息,如我想知道系统什么时候发生系统调用,发生的是什么系统调用等这些信息,有什么解决方案呢?最原始的方法是,找到内核系统调用的代码,加上我们需要获得信息的代码、重新编译内核、安装、选择我们新编译的内核重启。这种做法对于内核开发人员简直是梦魇,因为一遍做下来至少得需要1个多小时,不仅破坏了原有内核代码,而且如果换了一个需求又得重新做一遍上面的工作。所以,这种调试内核的方法效率是极其底下 阅读全文
posted @ 2013-09-17 19:31 hazir 阅读(32523) 评论(0) 推荐(4) 编辑
摘要: 本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁。基本结构我们首先要看的是几乎任何语言都具有的数据类型,包括字符串、整型、浮点型以及布尔类型。这些基本数据类型组成了基本控制块,从而创建我们的Python应用程序。字符串字符串(String)是一段文本字符,通常以某种形式向用户输出。如果我们打开Python的解释器,我们试着最常见的输出“Hello World!”应用:>>> print ("Hello, world!")Hello, world!Python 中的数据类型不需要像Java或C语言那样显示的定义,这就意味着 阅读全文
posted @ 2013-08-21 19:09 hazir 阅读(8053) 评论(0) 推荐(0) 编辑
摘要: 今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题。那么就总结一下C语言中结构体赋值的问题吧:结构体直接赋值的实现下面是一个实例:#include struct Foo { char a; int b; double c;}foo1, foo2; //define two structs with three different fieldsvoid struct_assign(void){ foo2 = foo1; ... 阅读全文
posted @ 2013-07-23 22:08 hazir 阅读(33956) 评论(6) 推荐(3) 编辑
摘要: 在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能。而当我们使用free命令查看Linux系统内存使用情况时,会发现内存使用一直处于较高的水平,即使此时系统并没有运行多少软件。这正是Windows和Linux在内存管理上的区别,乍一看,Linux系统吃掉我们的内存(Linux ate my ram),但其实这也正是其内存管理的特点。 free命令介绍 下面为使用free命令查看我们实验室文件服务器内存得到的结果,-m选项表示使用MB为单位:[root.. 阅读全文
posted @ 2013-07-16 22:23 hazir 阅读(11839) 评论(14) 推荐(6) 编辑
摘要: 本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel” 系列文章中),一来通过内核代码复习一下C语言及汇编语言的语法,二来学习内核开发大牛们书写代码的风格及思路。在内核文件 include/linux/bug.h中,有下面两行的宏定义:1 2 3 4 5 6 /* Force a compilation... 阅读全文
posted @ 2013-07-15 21:08 hazir 阅读(3610) 评论(1) 推荐(2) 编辑
摘要: 国际TOP500组织在6月17日公布最新全球超级计算机500强榜单,由中国国防科技大学研制的“天河二号”以每秒33.86千万亿次的浮点运算速度成为全球最快的超级计算机。天河2号(又称银河2号),将在今年年底部署在广州的国家超级计算机中心。天河2号的惊艳表现标志着时隔两年半后,中国超级计算机运算速度重返世界之巅,2010年11月天河1A曾荣登top500榜首。天河2号有16 000个节点,每个节点由两个Intel Xeon IvyBridge处理器和三个Xeon Phi 处理器组成,总共3 120 000个计算核心。Titan搭载Cray公司的XK7系统,位于美国能源部(DOE)的橡树岭国家实验 阅读全文
posted @ 2013-06-17 21:14 hazir 阅读(612) 评论(0) 推荐(0) 编辑
摘要: 前几天,我看到一个关于编程语言的调查,我发现到目前为止,C 编程语言在全球开发者中仍然稳居前三。如此多的代码使用C来编写,我想分享我多年学习总结的一些好的C语言编程实践。不要使用gets()和strcpy()再也不要使用诸如gets()、strcpy()、sprintf()等等这些函数,这已经是一个广为人知的一个事实,但这些函数仍然在库中,以用来支持那些已经使用这些函数的代码。如果你使用man手册关于gets()的说明,会发现:Never use gets(). Because it is impossible to tell without knowing the data in advan 阅读全文
posted @ 2013-05-22 19:04 hazir 阅读(1153) 评论(1) 推荐(2) 编辑

一个代码可以创造一个世界,也可以毁灭一个世界!