在Ubuntu-9.10 的 2.6.31-21 内核下运行 《Unix网络编程-第一卷第三版》(Unix Network Programming Volume 1, Third Edition, 简称 UNP 或 UNPv1e3), 有许多和以前系统或者其他系统以来的定义需要更改才能正常运行。以下是编译时遇到的错误和在当前系统下的可行改正方法。有共同需求的可以一起过来切磋切磋。
————————— Update 1, start ————————————
想运行 P107-Chap 5.4 的例子, 在 UNPv1e3/tcpcliserv 下面运行第一次运行 make 时出现
--> error 1:
tcpservpoll01.c:13: error: ‘OPEN_MAX’ undeclared (first use in this function)
解释:
运行 grep -r "OPEN_MAX" ./
可见 ./tcpcliserv/tcpservpoll01.c: include /* for OPEN_MAX */ 输出.
但是,OPEN_MAX 在 /usr/inlude/limits.h 已经不存在了,根据参考帖里的信息,我也强烈的怀疑现在 /usr/include/linux/fd.h 和 /usr/include/linux/limit.h 里的 NR_OPEN 就是作者所说的 OPEN_MAX。
Solution 1: OPEN_MAX --> NR_OPEN, 连 #include 这句都不用更改
Solution 2: 在 unp.h 里面手动添加 #define OPEN_MAX 1024, 这个 1024 从上面所说 NR_OPEN 的值得到,
至于 #include 句嫌麻烦的可不删.
--> error 2:
tcpservpoll01.c:28: error: ‘POLLRDNORM’ undeclared
参考帖( E文):(Google 关键词:error: ‘POLLRDNORM’ undeclared)
, 看了一些E 文帖,发现这些说的最丰富吧,加在一起也算完备了.
解释: 必须在任何使用 feature.h 的文件之前有 #define __XOPEN_SOURCE 的语句,而在 /usr/include/feature.h 干脆就有如下的注释语句:
#ifndef _FEATURES_H
#define _FEATURES_H 1
/* These are defined by the user (or the compiler)
to specify the desired environment:
__STRICT_ANSI__ ISO Standard C.
_ISOC99_SOURCE Extensions to ISO C89 from ISO C99.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
if >=199506L, add IEEE Std 1003.1c-1995;
if >=200112L, all of IEEE 1003.1-2004
_XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if
Single Unix conformance is wanted, to 600 for the
upcoming sixth revision.
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
_LARGEFILE_SOURCE Some more functions for correct standard I/O.
_LARGEFILE64_SOURCE Additional functionality from LFS for large fi
.....
但是有点扯的太远了,下面才涉及到问题本身:
根本原因 usr/include/sys/poll.h 缺少如下语句:
#ifdef __USE_XOPEN
/* These values are defined in XPG4.2. */
# define POLLRDNORM 0x040 /* Normal data may be read. */
# define POLLRDBAND 0x080 /* Priority data may be read. */
# define POLLWRNORM 0x100 /* Writing now will not block. */
# define POLLWRBAND 0x200 /* Priority data may be written. */
#endif
但事实上,这些在别处倒是真有定义,第三个参考帖里强人给出:
[arnuld@sumit asm-x86_64]$ cat poll.h
#ifndef __x86_64_POLL_H
#define __x86_64_POLL_H
/* These are specified by iBCS2 */
#define POLLIN 0x0001
#define POLLPRI 0x0002
#define POLLOUT 0x0004
#define POLLERR 0x0008
#define POLLHUP 0x0010
#define POLLNVAL 0x0020
/* The rest seem to be more-or-less nonstandard. Check them! */
#define POLLRDNORM 0x0040
#define POLLRDBAND 0x0080
#define POLLWRNORM 0x0100
#define POLLWRBAND 0x0200
#define POLLMSG 0x0400
#define POLLREMOVE 0x1000
#define POLLRDHUP 0x2000
struct pollfd {
int fd;
short events;
short revents;
};
#endif
[arnuld@sumit asm-x86_64]$ pwd
/usr/include/asm-x86_64
可见在 64位的相关文件里面是有定义的,而 32位的Linux 里面没有此相关定义。
Solution :还是乖乖地在 unp.h 里面自己定义这些东西吧,否则,就是编译内核的时候添加 _XOPEN_SOURCE 选项了,至于其他的使用 poll.h 时也会因为 poll.h 里面没有此选项而出现的相同的错误,等到遇到时再说吧。现在就 lazy 一下,直接修改 unp.h
Thu,May/27/2010
———————— Update 1, end ——————————
———————— Update 2. start ——————————
———————— Update 2. end ———————————
阅读(3726) | 评论(3) | 转发(2) |