unix高级网络编程

转载 2013年12月05日 21:49:49

  最近在学习《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 <sys/types.h>
#include <dirent.h>
#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(),它们所在的头文件一般都知道,分别是<stdio.h>和<stdlib.h>。而对于
opnedir (),readdir()和closedir(),我们可以通过man opendir,man readdir,man closedir得到这三个关于目录操作的函数所在的头文件都是:<sys/types.h>和<dirent.h>。这两个头文件在源程序中也已经列出。

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

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

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
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"的程序。这样,我们就可以单独的编译每一个例程,而不用顾及作者所给的杂凑的头文件。同时这种比较笨的方法,反而有利于帮助我们了解不同系统调用所对应的头文件,对于学习来说,这应该是一件好事。

 

UNIX环境高级编程、UNIX网络编程(卷一)环境搭建

最近学习这两本书,在直接编译书本源程序时,出现头文件“apue.h”(UNIX环境高级编程)及“unp.h”(UNIX网络编程)错误,在这里坐下配置的笔记。 首先需要安装Linux系统。(在Virtu...
  • luokh327
  • luokh327
  • 2016年01月12日 16:40
  • 1571

[网络编程] Linux网络编程经典书籍

首先要说讲述TCP/IP的书很多,其中有3泰书很全。 分别是《TCP/IP详解》三卷本,《用TCP/IP进行网际互连》三卷本,《TCP/IP指南》+《IPv6》四卷本 其中TCP/...
  • xinxing__8185
  • xinxing__8185
  • 2015年06月06日 17:15
  • 901

《UNIX环境高级编程》 —— 书中实例编译、运行

想认真学习《UNIX环境高级编程》的人士可能都想把书中的实例给敲一遍,运行看一下效果。但对于新手来说,可能会有一定的困难,因为例子中用到的头文件和一些函数不知道在哪里,编译可能也会出问题。这边文章就是...
  • wangyuling1234567890
  • wangyuling1234567890
  • 2014年04月02日 22:59
  • 1318

UNIX网络编程:卷2-读书笔记

UNIX网络编程:卷2 - 读书笔记
  • huanzai2
  • huanzai2
  • 2014年11月27日 20:51
  • 857

<<UNIX环境高级编程>>随书代码的打开方式

最近在学习>这本书,这本书里有好多包含代码的例子.自己打代码,太费事了,就从网上下,地址是:http://www.apuebook.com/          代码下载了,然后看到书上的第1个例子--...
  • u014804795
  • u014804795
  • 2015年12月08日 22:28
  • 510

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译本文地址:http://blog.csdn.net/caroline_wendy时间:2014.10.21. 下载代码:http://www.apuebook....
  • u012515223
  • u012515223
  • 2014年10月02日 23:31
  • 3336

《Unix环境高级编程》学习笔记:从点到面总结

以前在课堂上学习过《Unix初级教程(第四版)》,对于Unix有了一点了解。由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本《Unix环境高级编程》便在此列。希望能通过这本书...
  • benpaobagzb
  • benpaobagzb
  • 2016年03月03日 17:33
  • 487

Unix环境高级编程开篇-"apue.h"配置

书就不多说了,被称为Unix下C编程的圣经;不过现在国内貌似部分人都喜欢向别人推荐书,我很怀疑着部分人是不是推荐的每一本都看过。这个我暂时也不敢推荐,因为我也没有看完。 这本书上几乎所有的代码都用到...
  • u013220338
  • u013220338
  • 2015年09月14日 11:10
  • 1699

《Unix环境高级编程》 总结 (四)

1、口令文件 目录:/etc/passwd,如下: 用户名:密码:UID:GID:注释字段:初始工作目录:初始shell shell为空,则采用默认shell,常为/bin/sh 用户sq...
  • redheavenliu
  • redheavenliu
  • 2017年06月24日 00:58
  • 96

UNIX网络编程之源代码的编译和使用

源码的使用
  • it_wjw
  • it_wjw
  • 2016年07月09日 13:23
  • 2757
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:unix高级网络编程
举报原因:
原因补充:

(最多只允许输入30个字)