Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2081231
  • 博文数量: 145
  • 博客积分: 8668
  • 博客等级: 中将
  • 技术积分: 3912
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-09 21:21
个人简介

work hard

文章分类

全部博文(145)

文章存档

2016年(1)

2015年(1)

2014年(1)

2013年(12)

2012年(3)

2011年(9)

2010年(34)

2009年(55)

2008年(20)

2007年(9)

分类: BSD

2007-03-09 21:52:28

  最近在学习《UNIX环境高级编程》(Advanced Programming in the UNIX Environment, 简称APUE,以下使用简称)。该书的作者是W.Richard.Stevens,国际知名的UNIX和网络专家。我看的是该书的第一版,尤晋元翻译的。 网上有的评论该书翻译的比较差劲,有的说还行。我个人觉得,这本书的翻译还可以。并且,如果本身就有一定的UNIX/Linux基础的话,读起来应该不是 很吃力。同时我也下了该书的第二版(英文版),有什么看不懂的地方,再对照英文版看一下,辅助理解。
   这里要谈到的一个问题就是该书中的源代码编译的问题。此书中差不多每个历程中,都会有这样一行源码:
#include "ourhdr.h"
  
在第二版中改为:
#include "apue.h"

    这个头文件是作者把把每个例程中常用的标准头文件,一些常用的出错处理函数(err_**()之类的函数)和一些常用的宏定义给整理在一个头文件中。这个 可以省去在每个例程中录入较多的重复代码,这样可以减少每个例程的长度。但是,这样就给读者带来了不少麻烦。因为我们还要去搞明白如和把这个头文件编译, 然后做成库文件,添加到我们的系统中。特别读于初学者,本来满怀信心的,结果在编译第一个程序的时候就出现了问题。我也没有搞明白如何把 "ourhdr.h"静态的编译到系统中。

    不过,不明白如何使用"ourhdr.h"这个头文件,并不会影响我们学习APUE,也不会影响我们编译和运行每一个例程。其实,简单的想一下,如果一个 C程序要能顺利的编译和运行,除了我们要语法正确等方面外,最根本的是要保证我们程序中所调用的函数以及宏等等都要有完整的来源,也就是必须包含所有调用 函数和宏所在的头文件。对于一个具体的源程序,如果我们正确的包含了头文件,那么剩下的就是程序本生语法方面应该注意的事项。

    如何确定系统调用函数包含在那个头文件中呢?这在Unix/Linux系统下并非一件难事。Unix/Linux下命令man可以帮助我们找到。man命 令不仅可以帮助我们查找一般命令的用法,同时提供不同层次的帮助诸如系统调用或者管理员级别的命令等等(譬如FreeBSD6.1中,man 1是用户专用手册,man 2是系统调用,man 3是库函数查询等等)。

    下面我们就以APUE书中程序1-1 (实现ls命令部分功能)为例,来说明如何将书中的程序改编成全部使用标准头文件的程序。其中,操作系统用的是FreeBSD6.1,经过相应的修改可以 在书中所说的几个Unix系统及Linux系统中运行,我也曾在Debian Linux下成功编译和运行该程序。书中1-1.c的原始代码如下:

#include
#include
#include "ourhdr.h"

int
main(int argc, char *argv[])
{
    DIR                *dp;
    struct dirent    *dirp;

    if (argc != 2)
        err_quit("usage: ls directory_name");

    if ((dp = opendir(argv[1])) == NULL)
        err_sys("can't open %s", argv[1]);
    while ((dirp = readdir(dp)) != NULL)
        printf("%s\n", dirp->d_name);

    closedir(dp);
    exit(0);
}

    从书后面的附录中可以看到"ourhdr.h"的内容比较多,包含了比较多的常用头文件,一些宏定义和一些常用函数和出错函数的定义。其实,对于每一个具体的程序,我们只需要找到该程序中用到的头文件即可。

    该1-1.c中所用到的系统函数调用有:opnedir(),readdir(),printf(),closedir()和exit()。
其中,对于常用的函数prinft()和exit(),它们所在的头文件一般都知道,分别是。而对于
opnedir (),readdir()和closedir(),我们可以通过man opendir,man readdir,man closedir得到这三个关于目录操作的函数所在的头文件都是:。这两个头 文件在源程序中也已经列出。

    其次,1-1.c中还用到了作者自定义的两个函数:err_quit()和err_sys()。这两个函数主要使用来进行出错处理的。当然,使用这两个函 数对错误信息的处理是比较完善的。但是,作为我们学习来讲,了解程序的核心功能是首要的,我们可以将出错处理简化一点,即当遇到错误的时候,我们只简单的 使用printf()函数来提示一下有错误发生。当然,用printf()来进行出错处理并不是一种很合理的方法,而且往往我们看不到更关键的错误信息, 但对于我们仅仅作为学习来用还是可以接受的。毕竟我们要理解的核心部分是程序的功能实现,出错处理在于其次。

   通过以上的说明,我们可以将1-1.c修改为如下内容:

#include
#include
#include
#include
int main(int argc, char* argv[])
{
    DIR *dp;
    struct dirent *dirp;
   
    if(argc != 2)
    {
        printf("You need input the directory name.\n");
        exit(1);  
    }
   
    if((dp = opendir(argv[1])) == NULL)
    {
        printf("cannot open %s\n", argv[1]);
        exit(1);   

    }

    while ((dirp = readdir(dp)) != NULL)
        printf("%s\n", dirp->d_name);


    closedir(dp);

    exit(0);
}

    这样修改后的程序已经与作者的头文件"ourhdr.h"没有关系,可以单独的进行编译。我使用的是root用户,执行命令:

# gcc 1-1.c  //生成目标文件a.out
或者
# gcc -o 1-1 1-1.c  //生成目标文件1-1

    没有任何错误和警告,说明编译成功。这时我们执行生成的目标文件:

# ./a.out /home
或者
# ./1-1 /home

    则会列出/home路径下的所有文件,包括目录(.)和(..)。

    通过这样的方法,基本上我们可以将该书中所有的例程修改成不包含"ourhdr.h"的程序。这样,我们就可以单独的编译每一个例程,而不用顾及作者所给 的杂凑的头文件。同时这种比较笨的方法,反而有利于帮助我们了解不同系统调用所对应的头文件,对于学习来说,这应该是一件好事。

    现在,我也才学到APUE的第四章了。前四章的程序,我都是采用这种方法进行编译和运行。如果也有在学习APUE的朋友,我们可以一起交流。
阅读(12211) | 评论(21) | 转发(3) |
给主人留下些什么吧!~~

chinaunix网友2010-10-03 23:53:08

引力的实质是什么 摘要:牛顿提出万有引力定律已300多年,至今引力成因仍不知道。本文用[正反一次筛]新型数论,阐明在耦合强度作用下,能量嬗变为物质时,孪生出等量的反物质,与其他普通物质发生交叉的吸引力。从而推导出万有引力的定义数值公式,统一了四个作用力。 关键词:正反一次筛;物质是能量的结晶体;夸克存在形式是质能分界线;反物质是宇宙基因 【天机不可泄露】 ─ 引力实质吟咏调 ─ 神机妙算朦胧话 屈指可数话天机 宇宙始终都是空 空到黑暗无时空 长眠混沌终有期 对立统一有阴阳 永恒运动似台风 耦合激发大暴炸 元素素数分正负 阴阳结合是太极 哥猜素数二合一 质子中子生原子 哥猜素数三合一 三个夸克是粒子 三阴三阳八卦图 正是粒子八重态 都是夸克在游荡 产生四个作用力 粒子夸克是物质 游荡夸克是能量 宇宙能量生物质 物质生物三苷酸 8×8=64个

chinaunix网友2010-03-13 15:06:54

哥德巴赫猜想的意义和用途: 已证得:“任一偶数 表为两个奇素数之和 的奇素数对 个数 最少是 开方后奇素数总个数,且恒不小于1”。详参阅: 网 址: http://www.sea3000.net/xushichuan 评价2009.10.5《中国科技教育》杂志编辑部评价: 来稿已阅,其份量之重,价值之高,不容质疑. 猜想是世界难题,它所属领域必具重要性,背后隐藏着更重要性质或规律。仿效此法可论证: 1、用模6子集S ={6n±1 n=1,2,…}进行前(6n-1),后(6n+1)一次筛,可论证“孪生素数猜想”(另文); 2、用正反、前后一次筛,可论证“梁定祥猜想” (另文); 3、[正反一次筛]原理, 揭示了素数变化的规律性, 把普通筛法原点由0移至需要的(任意大)自然数处, 再进行反筛; 令不等同余方程的解等于1, 其解值x, 则 是《素数通用公式》; 2009.10.5《中国科技教育》杂志编辑部评价: 来稿已阅,其份量之重,价值之高,不容质疑. 12月《中国教育实践与研究论坛》评委会获奖通知:[正反一次筛]荣获大赛壹等奖.入选大型教育文献《现代教育理论与实践

chinaunix网友2010-02-04 08:54:44

哥德巴赫猜想的意义和用途: 已证得:“任一偶数 表为两个奇素数之和 的奇素数对 个数 最少是 开方后奇素数总个数,且恒不小于1”。详参阅: 网 址: http://www.sea3000.net/xushichuan 评价2009.10.5《中国科技教育》杂志编辑部评价: 来稿已阅,其份量之重,价值之高,不容质疑. 猜想是世界难题,它所属领域必具重要性,背后隐藏着更重要性质或规律。仿效此法可论证: 1、用模6子集S ={6n±1 n=1,2,…}进行前(6n-1),后(6n+1)一次筛,可论证“孪生素数猜想”(另文); 2、用正反、前后一次筛,可论证“梁定祥猜想” (另文); 3、[正反一次筛]原理, 揭示了素数变化的规律性, 把普通筛法原点由0移至需要的(任意大)自然数处, 再进行反筛; 令不等同余方程的解等于1, 其解值x, 则 是《素数通用公式》; 2009.10.5《中国科技教育》杂志编辑部评价: 来稿已阅,其份量之重,价值之高,不容质疑. 12月《中国教育实践与研究论坛》评委会获奖通知:[正反一次筛]荣获大赛壹等奖.入选大型教育文献《现代教育理论与实践

chinaunix网友2009-01-29 09:01:27

肯定破解哥德巴赫猜想的理由: 1、集美大学副教授林晴炎信“…从 而完成了对哥德巴赫猜想的论证”右图 2、 [定理1]由华南师范大学钟 集 教授审核确定。2001年8月由中科院 数学所《数学学报》审核过。图2 3、电脑验证正确: A、十年来按公式手算数以千计例题与电算一致,对照素数表没发现错或漏。仅发现 = 6、12、38、68等有下界极限值。 B、苏州大学朱 烈数论导师等验算[定理2]结论:对 <20001正确。 C、2004年深圳大学宋富高副教授用四个月运算偶数 共有2047个极小值,均满足[定理2]要求。 4、苏州大学朱 烈导师、华南师范大学钟 集教授、香港大学曾啟文等数论教授,都同意在数学杂志发表(已发表在首届民科会刊上) 5、徐州师范大学许峰宇教授说:“…你这样, 不是破解(注:指哥猜)了吗”; 山东大学孙伯奎数学教授说:“对世界来说, 可不得了”。 6、网上评价:“…理论新颖者,许世传;可与数学泰斗比创新” “筛法证明中存在的逻辑矛盾”一文中:“---确定其中一个为素数时,怎样保证另一个奇数一定也可以成为素数呢?这个问题在数学理论上是办不到的。全世

chinaunix网友2008-01-24 10:24:02

宇宙旋律的凯歌 物也空 事也空 宇宙万物皆归空 空空空 宇宙万物生其中 □ 物理学家研究虚无怪事为真空 相等正负能量合称也是空★ 空到黑暗无时空: 没有方向 没有时间 漆黑又朦胧★★ 哪里是对立统一•阴阳同在的乾坤境界! □ 约在50亿年前 宇宙落地哭声震环宇 首先敬畏运动永恒是天命 正负极限能量移动相迂似台风 偶合激发宇宙大暴炸 火焰海 钢铁水 漫无边际在暴涨 胡芦炼丹三生万物★★★也天命 三阴三阳组合八卦图 击中质子中子粒子八重态★★★★ “一个偶数是二个奇素数之和” 恰是阴阳结合【质子+中子=原子】是太极 原子生分子 分子生万物 确是物质是能量的结晶体 ↓ 生物始祖DNA 8•8=64个密码子 三个核苷酸来组成 正反核苷酸链组成双螺旋 □ 物质粒子筹命最长1030年是天命 到时筹终正寝在黑洞也归空 ★ 在数学上相等正负能量总和是零。 ★★ 有物质体才有上下、左右、前后的三维空间;有物质移动才有钟表、电子的计时器。 ★★★ 《易经》是人类几千年观察宇宙万物悟出的事物存在