对RedHat系统的一些概括性描述 III
13. readline and history
------------------------
一个互交式的程序经常需要读用户的输入, 通常我们使用GNU的readline
库来完成. 同时使用history库来作历史的处理. 这些东东很简单, 知道就会用.
例如:
hist.c
#include
#include
main()
{
char *input;
while ((input = readline(\">>\")) != NULL) {
add_history(input);
printf(\"input : %s\\n\", input);
free(input);
}
}
gcc hist.c -lreadline -lhistory
只有一点要注意, readline返回的东东一定要free掉.
14. static variable
-------------------
许多的glibc的函数会返回一个结构的指针, 那么这些指针指到那里去了呢?
通常他们有下列的结构:
static struct some_structre one;
struct some_strutre *function()
{
........
// some c station
return &one;
}
例如: gethostbyname ctime等通通都是这样. 因此, 下列的用法就是错误的.
struct hostent *host_friday, *host_koun;
host_friday = gethostbyname(\"friday\");
... ...
host_koun = gethostbyname(\"koun\");
... ...
// here is the error
printf(\"%s\", inet_ntoa(*host_friday->h_addr));
// because the pointer host_friday point to info of \"koun\"
15. assert
----------
用于调试程序.
#include
void assert(int expression);
当expression为\假\的时候, 程序被终止运行.
例如:
char *p = malloc(1000);
assert((int)p);
当malloc失败的时候, p = NULL, 这时, 会打印类似下面的信息:
a.out: a.c:9: main: Assertion `p\ failed.
Aborted (core dumped)
这样一来就很方便你调试程序.
对于一个调试完毕的程序, 只要加上
#define NDEBUG
或编译的时候加上如下的参数:
-DNDEBUG
就可以取消assert了.
16. errno
---------
许多的函数在退出的时候, 如果发生错误会置errno.
#include
extern int errno;
对于这个东西, 我想强调两点:
1. 通常如果一个函数工作正常, 它不会去改变errno的值.
2. 在信号处理程序中, 如果有函数调用, 要保留errno的值, 并
在退出的时候恢复.
发布人:Crystal 来自: