当前位置:Linux教程 - RedHat - 对RedHat系统的一些概括性描述 III

对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 来自: