【转】APUE学习1:迈出第一步,编译myls.c
原文网址:http://blog.csdn.net/sddzycnqjn/article/details/7252444
注:以下写作风格均学习自潘云登前辈
/******************************************************************/
By: 聂强
Date: 2012-2-12
Email: sddzycnq@gmail.com
Homepage: http://blog.csdn.net/sddzycnqjn
Copyright: 该文章版权由聂强所有。可在非商业目的下任意传播和复制。
对于商业目的下对本文的任何行为需经作者同意。
/******************************************************************/
运行环境:Ubuntu 10.04.1 LTS
Linux version 2.6.32-24-generic
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
在当当网订购的《unix环境高级编程》还未到。求学心切,先下载了PDF版一睹为快。
但编译第一个例子就出现了问题:
myls.c:1:19: apue.h: No such file or directory
myls.c: In function `main':
myls.c:13: error: `NULL' undeclared (first use in this function)
myls.c:13: error: (Each undeclared identifier is reported only once
myls.c:13: error: for each function it appears in.)
找不到头文件apue.h。
网友支招:
1. www.apuebook.com下载源代码。
2. 解压得到目录apue.2e。
3. 将 apue.2e/include下apue.h文件拷贝至/usr/include。
此时,再编译还会出问题:
/tmp/ccBBopm0.o(.text+0x2b): In function `main':
: undefined reference to `err_quit'
/tmp/ccBBopm0.o(.text+0x5f): In function `main':
: undefined reference to `err_sys'
collect2: ld returned 1 exit status
提示找不到函数err_quit和err_sys。
4. 解决步骤3问题的办法:
在目录/usr/include,创建文件myerr.h。其中myerr.h内容为附录B中内容(现将代码贴出):
读书要仔细:
《unix环境高级编程》第5页作者有这样一句话“在这20行的程序中,有很多细节需要考虑”。
·首先,其中包含了一个头文件apue.h。本书中几乎每一个程序都包含此头文件。……。附录B中列出了这一头文件。
·……
·调用了两个自编的函数来对错误进行处理:err_sys和err_quit。……。这两个出错处理函数在附录B中说明,1.7节将更多地叙述出错处理。
- <span style="font-family:SimSun;">#include "apue.h"
- #include <errno.h>/* for definition of errno */
- #include <stdarg.h> /* ISO C variable aruments */
- static void err_doit(int, int, const char *, va_list);
- /*
- * Nonfatal error related to a system call.
- * Print a message and return.
- */
- void
- err_ret(const char *fmt, ...)
- {
- va_list ap; va_start(ap, fmt);
- err_doit(1, errno, fmt, ap);
- va_end(ap);
- }
- /*
- * Fatal error related to a system call.
- * Print a message and terminate.
- */
- void
- err_sys(const char *fmt, ...)
- {
- va_list ap; va_start(ap, fmt);
- err_doit(1, errno, fmt, ap);
- va_end(ap);
- exit(1);
- }
- /*
- * Fatal error unrelated to a system call.
- * Error code passed as explict parameter.
- * Print a message and terminate.
- */
- void
- err_exit(int error, const char *fmt, ...)
- {
- va_list ap; va_start(ap, fmt);
- err_doit(1, error, fmt, ap);
- va_end(ap);
- exit(1);
- }
- /*
- * Fatal error related to a system call.
- * Print a message, dump core, and terminate.
- */
- void
- err_dump(const char *fmt, ...)
- {
- va_list ap; va_start(ap, fmt);
- err_doit(1, errno, fmt, ap);
- va_end(ap);
- abort(); /* dump core and terminate */
- exit(1); /* shouldn't get here */
- }
- /*
- * Nonfatal error unrelated to a system call.
- * Print a message and return.
- */
- void
- err_msg(const char *fmt, ...)
- {
- va_list ap; va_start(ap, fmt);
- err_doit(0, 0, fmt, ap);
- va_end(ap);
- }
- /*
- * Fatal error unrelated to a system call.
- * Print a message and terminate.
- */
- void
- err_quit(const char *fmt, ...)
- {
- va_list ap; va_start(ap, fmt);
- err_doit(0, 0, fmt, ap);
- va_end(ap);
- exit(1);
- }
- /*
- * Print a message and return to caller.
- * Caller specifies "errnoflag".
- */
- static void
- err_doit(int errnoflag, int error, const char *fmt, va_list ap)
- {
- char buf[MAXLINE];
- vsnprintf(buf, MAXLINE, fmt, ap);
- if (errnoflag)
- snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
- strerror(error));
- strcat(buf, " ");
- fflush(stdout); /* in case stdout and stderr are the same */
- fputs(buf, stderr);
- fflush(NULL); /* flushes all stdio output streams */
- }</span>
5. 编辑/usr/include/apue.h。在最后一行#endif /* _APUE_H */前面添加一个声明:#include "myerr.h"
OK,至此。
再次编译:gcc -o myls myls.c 成功
运行: ./myls /dev
结果:
.
..
mixer
audio
dsp
……
……
port
null
mem
rfkill
vga_arbiter
【转】APUE学习1:迈出第一步,编译myls.c的更多相关文章
- C#开发学习人工智能的第一步
前言 作为一个软件开发者,我们除了要学会复制,黏贴,还要学会调用API和优秀的开源类库. 也许,有人说C#做不了人工智能,如果你相信了,那只能说明你的思想还是狭隘的. 做不了人工智能的不是C#这种语言 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----文件系统操作与磁盘管理
介绍 本节的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习后续其他内容的过程中有极大帮助. 因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前 ...
- [EntLib]微软企业库5.0 学习之路——第一步、基本入门
话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...
- 学习Nodejs的第一步
最近看了几本关于Node.js的书,本来个人技术分享网站http://yuanbo88.com/是打算用Node.js作为服务器端语言来处理后台的,后来又改成了PHP(也是自己研究,毕竟网上DEMO多 ...
- apue学习笔记(第一章UNIX基础知识)
总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...
- 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- ExtJS学习之路第一步:对比jQuery,认识ExtJS
最近纷杂的事情比较多了,奔波ing!所以,Node.js 和Canvas动画系列都停止了,等稳定了再重拾书本继续学习!因为某种原因最近在看ExtJS,分享下学习的心得,希望对同道中人有所帮助. 第一用 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----Linux 下软件安装
介绍 介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用. 一.Linux 上的软件安装 通常 Linux 上的软件安装主要有三种方式: 在线安装 从磁盘安装deb软件包 从二 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----正则表达式基础
介绍 虽然我们这一节的标题是正则表达式,但实际这一节只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包含正则表达式).正则表达式本身的内容很多,要把 ...
随机推荐
- CentOS 6.6安装LAMP和Subversion服务器
目标:在CentOS 6.6上安装LAMP,并安装最新版1.8.*的Subversion服务器,和Subversion权限管理前端iF.svnadmin. 安装步骤: 安装新一些版本LAMP步骤 1. ...
- URAL 1073 Square Country(DP)
题目链接 题意 :这个人要投资地,每块地都是正方形并且边长都是整数,他希望他要买的地尽量的少碎块.每买一块地要付的钱是边长的平方,而且会得到一个一份证书,给你一个钱数,让你求出能得到的证书个数. 思路 ...
- hdu 2481 Toy
好题!!!没话说…… 用到的知识面很多,这题的难点在于公式的推导. 原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795d ...
- hdu1116
http://acm.hdu.edu.cn/showproblem.php?pid=1116 #include<stdio.h> #include<math.h> #inclu ...
- 最长不下降子序列//序列dp
最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...
- Xamarin.Android 入门之:Xamarin快速入门
一. 准备工作 1.新建一个项目取名为phoneword 2.在项目创建好之后,让我们展开“Resources”文件夹然后找到并打开该文件夹下的“layout”文件夹,双击main.axml在Andr ...
- 40. Combination Sum II
题目: Given a collection of candidate numbers (C) and a target number (T), find all unique combination ...
- JAVA+ Proxool+ SQLserver 2008 “signer information does not match signer information of other classes in the same package”
1. Proxool+SQLserver2008(sqljdbc4.jar)集成问题最近在项目中遇到个问题:我用的是Proxool连接池,连接SQLserver2008数据库,控制台报错:签名信息和同 ...
- C++:类的创建
类的创建 #include<iostream> #include<cmath> using namespace std; class Complex //声明一个名为Compl ...
- Android Handler消息传递
一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的原则:只允许UI线程 ...