随笔分类 - Linux/Unix
摘要:本文介绍如何编写一个简单的make而非如何编写makefile。通过分析makefile的格式提取其中的文件依赖的处理并存放到数据结构,简单介绍了make使用的时间戳,并使用DFS完成是否存在环和是否需要重新编译的判断,从而提供make的基本功能。源代码已托管至github。
阅读全文
摘要:本文一步一步地教你如何编写一个具有基本功能的shell,特点是由简单到复杂,逐步添加新的特性,注重思路的展示而不是代码的堆砌,因而不会直接呈现一个完善的版本;同时练习相关的Linux的API,有助于破除对shell的神秘感。源码托管在:https://github.com/vvy/wshell
阅读全文
摘要:本系列博文是《现代操作系统》(Modern Operating Systems)的阅读笔记,定位是正文精要部分的摘录和课后习题精解,因此不会事无巨细的全面摘抄,仅仅根据个人情况进行记录和推荐。本节重点介绍:系统调用的发生过程、shell的基本原理、link原理等。
阅读全文
摘要:wrieshark sudo yum install wireshark-gnome sudo wireshar (以root启动,否则看不到网卡)网站URL格式 以查询lumia为例 google http://www.google.com/search?q=lumia baidu http://www.baidu.com/s?wd=lumia tb http://s.taobao.com/search?q=lumia 亚马逊 http://www.amazon.cn/s/keywords=lumia 当当 http://search.dangdan...
阅读全文
摘要:以HelloWorld为基础,修改为读取nginx.conf配置项并输出的程序,理清在读取配置项时,存储结构ngx_http_mytest_conf_t、初值生成方法create_loc_conf()、解析方法数组ngx_command_s[]和合并方法merge_loc_conf()的原理和联系。
阅读全文
摘要:最近在读陶辉的《深入理解Nginx》,一是可以跟着大牛练练阅读和编写开源代码的能力,二是想学学Nginx优秀的架构设计,三是想找一个点深入下Linux环境下网络编程的细节。读书的时候自然少不了实际地动手,这个系列的博文是对学习过程的梳理和动手过程的补充。原书对实践中一些已提及的细节问题不再赘述。
阅读全文
摘要:原定标题是“linux自带的测试、调试、性能工具”,不过并不恰当,比如本文要提到的gdb,很多Linux发行版中都提供了它,但毕竟不是Linux的必要组成部分,只是对与大多数Linux用户随手可得罢了。合理组合使用这些工具可以满足更复杂的要求,并写成测试脚本,能为测试提供很大的方便。本文不涉及具体的脚本编写,也不涉及与网络相关的命令如netstat和tcpdump。 为了方便阅读,用横线把内容进行分割,并且每个下划线下对这部分主要内容进行提示。 对于1~6这几个命令,单独使用时看上去很简单,但当它们结合重定向和正则表达式从而构成更复杂的功能甚至是自动化脚本时,才能发挥其真正威力。 c...
阅读全文
摘要:比如想在gcc手册里找-o选项对应的解释,如果man gcc | grep -o,grep会把-o当做自己的命令选项,是得不到正确结果的。 如果想得到正确结果,把待查的-o扩展成*-o就行了,不过这时需要给grep加上-E选项,所以最终的实例为:man gcc |grep -E *-o
阅读全文
摘要:用于内存管理的malloc/free这对函数,对于使用C语言的程序员应该很熟悉。前段时间听说有的IT公司以“实现一个简单功能的malloc”作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下。毕竟把题目做出来是次要的,了解实现思想、提升技术才是主要的。本文主要是对malloc/free实现思路的介绍,蓝色部分文字是在个人思考中觉得比较核心的东西;另外对于代码的说明,有一些K&R上的解释,使用绿色加亮。 在研究K&R第八章第七节的实现之前,不妨先看看其第五章第四节的alloc/afree实现,虽然这段代码主要目的是展示地址运算。alloc实现#d
阅读全文
摘要:前言: 这算是第二次系统地阅读UNPv1,正如副标题,不希望写成书摘、缩写版,尽量多写写个人体会和获得的经验,因此很多地方都会从全书的角度来说明,而不仅仅限于某个章节内部。 SCTP、信号驱动I/O、广播和多播等内容不包括在内。准备工作: 为了适应在命令行界面编写代码,我先进行了vim环境的配置和Xshell的配置。在读书过程中还学习了gdb调试程序的方法(见这里)。(1)vim插件搭建 从别人那里拷贝现成的的.vimrc和插件,分别放于/home/用户名 和/home/用户名/vim文件夹下就行了。(2)Xshell远程登录 下载安装Xshell。由于是用VMware装的Ubu...
阅读全文
摘要:这几天照着UNP上提供的ping源码编写了一个用来学习。虽然编译后能运行,但由于使用了原始套接字,必须root权限运行,这与和Linux下真实的ping有差别:后者是不需要输入sudo或者切换到#才能运行的。linux中的ping源码没有找到,但是看到oschina上有一例自制的ping源码相似,作者提供的示意图中在$提示符下没有用sudo运行的。总之,希望能够使自己编写的程序以root权限运行而不需要加上sudo或者切换到#提示符。 没有找到能在进程运行时提升自身权限的方法,另查到一种方法(来源见文后注释)可以实现,这两步缺一不可:(1)用root权限完成gcc;(2)chmod u+...
阅读全文
摘要:本文主要参考自:http://www.cnblogs.com/zzx1045917067/archive/2012/12/26/2834310.html,进行了一点补充和编排;Core dump部分参考了:http://blog.ddup.us/?p=176。 gdb是一个在UNIX环境下的命令行调试工具。 如果需要使用gdb调试程序,请在gcc时加上-g选项。 下面的命令部分是简化版,比如使用l代替list等等。1.基本命令1)进入GDB #gdb test test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。2)查看源码 ...
阅读全文
摘要:Xshell是一个安全终端模拟软件,可以进行远程登录。我使用XShell的主要目的是在Windows环境下登录Linux终端进行编码,非常方便。本文简单介绍下它的使用方法。1.下载后在安装时选择个人/学校免费版即可。2.安装完毕后先在要连接的Ubuntu主机下开启SSH服务,如果没有开启需要安装openssh-server:sudo apt-get install openssh-server 使用ps -e | grep ssh,如果只有ssh-agent表示还没启动,需要/etc/init.d/ssh start;有sshd说明已启动。3.打开Xshell,选择“新建”,“连接”设置...
阅读全文
摘要:我在网上查找安装方法时有两种方式,第一种方案在第三步测试的时候没有成功,不知道问题出在哪里,换用了第二种方式。如果直接用第二种方式安装不成功,可以试试进行第一种方式的第2步。 安装环境是Ubuntu 10.04,内核版本2.6.32.22。OpenCV版本为2.4.3。第一种方式,参考自:http://www.opencv.org.cn/index.php/Debian%E4%B8%8B%E5%AE%89%E8%A3%851.更新下载更新软件包列表信息$ apt-get update2.查询OpenCV相关软件包 查询获得的内容和OpenCV软件包版本有关$ apt-cache sea...
阅读全文
摘要:安装方法:(参考自http://blog.csdn.net/abee23/article/details/7391859,很详细,下面的整理只为存档)1.下载$cd ~/Download$mkdir matlab$cd matlab$wget -c http://math.whut.edu.cn/shumo/special/msoft/mac/matlab_unix_2009b.iso(wget支持断点续传,但是我是用Win下的下载工具进行的)2.安装安装环境: Linux wy-desktop 2.6.32.22 #7 SMP Wed Jul 11 15:31:29 CST 2012 i6.
阅读全文
摘要:在这两种架构下添加系统调用的步骤是类似的,简要地比较一下,以2.6.28.6内核为例。 1.在内核源码相应位置(如sys.c或其他与这个函数联系紧密的文件)添加新的内核函数作为系统调用,形如asmlinkage long sys_foo(void) {} 2.加入系统调用表。ARM架构存放于/arch/arm/kernel/call.S中,形如CALL(sys_foo);x86架构放于/arch/x86/kernel/syscall_table_32.S中,形如.longsys_foo。 3.定义系统调用号。ARM架构存放于/arch/arm/include/asm/unistd.h...
阅读全文
摘要:以S3C6410为例,此时arm-none-linux-gnueabi-4.3.2已经安装完毕。 首先把和板子上烧写的内核同样的内核源码放置到任意目录下,如/usr/src/s3c-linux-2.6.28.6-Real6410。(内核源码需要配置,而板子附带CD上一般是配置好的,在上面修改简单一些) 进行make或./build。遇到了报错,找不到XX文件。查看了一下,指定目录下是有这个文件的。make clean再进行./build就行了。 在需要编译的目标代码目录下编写makefile文件,内容如下:CROSS_COMPILE:= arm-linux-ARCH:= armCC:...
阅读全文
摘要:需求源于项目中一部分设计的代码。struct semaphore类型的信号量,使用up()进行释放,down_interruptible()和down()获得指定信号量(前者中,若该信号量已争用则进入可中断睡眠,后者进入不可中断睡眠)。 理想中的流程应该是线程调用down()阻塞一个信号量,等待另一个线程调用up()释放,从而实现同步。但如果另一个线程使用up()释放多次,会有怎样的结果呢?LKD上没有进行详细的解释,我使用一个简单的测试程序,其中的核心代码如下:/* A线程,释放信号量 */while(!kthread_should_stop()){ up(&my_sem); ...
阅读全文
摘要:EXPORT_SYMBOL出现于2.6内核,可以把内核中的函数导出到全局符号表供其他内核模块(包括用户自己写的内核模块)使用。有个限制是,这个导出的符号不能是static类型。由于需要使用内核的do_adjtimex()函数进行tick_length的调节,而这个函数在/kernel/time/ntp.c中,这里便以此为例。 首先需要在函数定义后加入“EXPORT_SYMBOL(do_adjtimex);”并且在这个c文件开头进行module.h头文件的包含(#include <linux/module.h>)。这时需要编译内核。 然后,在自己编写的内核模块用extern声明这个函
阅读全文
摘要:接上一篇,能正确启动内核线程,就可以进行进一步的使用了。这里介绍下更改内核线程调度策略和优先级的方法。 个人理解,内核级线程和进程是一样的,前者与POSIX线程(pthread)有很大的区别。因此,内核的进程调度策略和系统调用也适用于内核级线程。 调度策略有三种: 1.SCHED_NORMAL 非实时调度策略,默认情况下是100~139,由nice值决定; 2.SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于...
阅读全文