分享

完全认识GNU C 语言库glibc

 心不留意外尘 2016-04-25
from http://zhoulifa./6091358.html
作者:
1、C语言库是用来干什么的?
编程人员所提到的库,其英文是library,到底是什么呢?简单说就是一些通用的程序代码被生成文件存储起来了,以后任何人写程序时如果需要用到这些通用代码只需要调用库函数接口就可以了。比如我们C程序里通常用的printf函数,就是用来将程序里的信息输出到屏幕上的。如果要求每个写程序的人都自己来写个函数去调用内核接口实现屏幕输出,那将是极大的浪费,所以前人已经写好这个函数相关的库了,在我们Linux系统中,这个库是GNU C语言库glibc,就是这个文件/usr/lib/libc.so。当然,如果要使用一个库文件,首先得有个头文件来定义库文件里的每个函数,比如/usr/include/stdio.h,我们写程序时,只需要#include 就可以用printf来向屏幕输出信息了。
后面我们讲到如何自己生成库文件时,大家一定会相当明白,现在先知道库的基础知识吧。
2、如何获得库和手册
首先,搜索到库文件,在Ubuntu和Debian系列的Linux系统中,我用这个命令就可以:

apt-cache search GNU c library
此命令输出部分如下:

glibc-doc-reference - GNU C Library: Documentation
libc6 - GNU C Library: Shared libraries
libc6-amd64 - GNU C Library: 64bit Shared libraries for AMD64
libc6-dbg - GNU C Library: Libraries with debugging symbols
libc6-dev - GNU C Library: Development Libraries and Header Files
libc6-dev-amd64 - GNU C Library: 64bit Development Libraries for AMD64
libc6-i686 - GNU C Library: Shared libraries [i686 optimized]
libc6-pic - GNU C Library: PIC archive library
libc6-prof - GNU C Library: Profiling Libraries
libc6-xen - GNU C Library: Shared libraries [Xen version]
或者你可以搜索libc或glibc
因为我们要编程序,即进行开发,所以我们得安装libc6-dev这个软件包。
用这个命令查看一下这个软件包的具体信息:

apt-cache show libc6-dev
此命令输出的部分如下:

Description: GNU C Library: Development Libraries and Header Files
Contains the symlinks, headers, and object files needed to compile
and link programs which use the standard C library.
然后就可以运行命令安装此软件包:

apt-get install libc6-dev
安装完成后可以查看一下这个软件包提供了一些什么,用下面这个命令:

dpkg -L libc6-dev

此命令输出如下,即安装此软件包后,系统中多了如下这些文件:

由于这里只允许上传图片和音乐文件,所以用另一个页面来存储这些文本信息了
dpkg -L libc6-dev命令的所有输出内容在这里
显然,在/usr/bin目录下的是一些工具命令,用来辅助我们编程或调试程序的。/usr/lib目录下是一些库文件,我们编写程序时直接调用这些库文件提供的函数就可以完成很多工作了。在/usr/include目录下的就是头文件,在编程序时要include进来才可以用库提供的函数。而在/usr/share/man目录下的是在线手册,比如上面有个文件是/usr/share/man/man1/gencat.1.gz,那么我们可以通过man gencat查看到关于gencat相关的手册。而在/usr/share/doc/目录下的就是这个软件所带的相关文档,建议在使用软件包之前看一下这里面的一些文档,相当于是我们的自学教材的。当然,只安装libc6-dev这一个软件包可能没有什么详细的资料给你,如果把下面这几个软件包也安装上可能资料就相当全了。

glibc-doc-reference - GNU C Library: Documentation
manpages-dev - Manual pages about using GNU/Linux for development
glibc-doc - GNU C Library: Documentation
glibc-doc-reference这是我们的glibc参考手册,就象世面上可能会看到的某些书<X编程参考>
manpages-dev是man手册,安装上这个软件包之后,你就可以通过man printf直接来看这个函数的用法。
glibc-doc是文档。
安装完这几个软件后,可以用dpkg -L命令分别查看一下这几个软件包所提供的内容。
比如glibc-doc这个软件包提供的内容如下:
dpkg -L glibc-doc命令的所有输出内容在这里
而manpages-dev软件包提供的文件如下:
dpkg -L manpages-dev命令的所有输出内容在这里

3、如何从手册中自我学习
首先,我相信在glibc-doc软件包提供的内容里有这些东西你一定看到了:

/usr/share/doc/glibc-doc/html
/usr/share/doc/glibc-doc/html/libc.html
/usr/share/doc/glibc-doc/html/libc_1.html
/usr/share/doc/glibc-doc/html/libc_2.html
/usr/share/doc/glibc-doc/html/libc_3.html
/usr/share/doc/glibc-doc/html/libc_4.html
/usr/share/doc/glibc-doc/html/libc_5.html
/usr/share/doc/glibc-doc/html/libc_6.html
/usr/share/doc/glibc-doc/html/libc_7.html
/usr/share/doc/glibc-doc/html/libc_8.html
/usr/share/doc/glibc-doc/html/libc_abt.html
/usr/share/doc/glibc-doc/html/libc_ovr.html
/usr/share/doc/glibc-doc/html/libc_toc.html
很显然,这是html网页式的libc文档,赶紧打开一个浏览器打开/usr/share/doc/glibc-doc/html/libc_toc.html来看吧,相信把这几个文档看完之后你对libc有一些了解了。
其次,在glibc-doc和manpages-dev两个软件包里提供了一些/usr/share/man目录下的文件。这就是man命令可以看到的内容了。
比如:你可能看到了/usr/share/man/man2/chmod.2.gz,说明在man手册的第2章有个chmod的帮助手册。输入下面的命令看看这个chmod如何编程使用吧:
man 2 chmod
通过这个man手册你就知道如何自己编写一个程序来调用函数chmod实现修改文件属性的工作了。
又比如:你可能看到/usr/share/man/man3/abs.3.gz,说明在man手册的第3章有个abs的帮助手册可以看。输入下面的命令你就知道如何在程序里求一个数的绝对值了:
man 3 abs

相信你把这些软件包提供的所有内容都掌握的时候已经是相当高手的了。

/************关于本文档********************************************
*filename: 我是这样学习Linux下C语言编程的-完全认识GNU C 语言库glibc
*purpose: 说明怎样利用glibc开始Linux下C语言编程
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-02-05 13:06
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to:Google
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/

4、看到man手册后如何编程?
可能有人会问了,其实相当简单,照着man手册说的写到程序里就行了。
比如man 3 abs时看到:

NAME
       abs, labs, llabs, imaxabs - compute the absolute value of an integer

SYNOPSIS
       #include <stdlib.h>

       int abs(int j);
       long int labs(long int j);
       long long int llabs(long long int j);

       #include <inttypes.h>

       intmax_t imaxabs(intmax_t j);

DESCRIPTION
       The  abs()  function computes the absolute value of the integer argument j.  The labs(), llabs() and imaxabs() functions compute the
       absolute value of the argument j of the appropriate integer type for the function.

RETURN VALUE
       Returns the absolute value of the integer argument, of the appropriate integer type for the function.
这里说得很清楚,abs函数就是用来返回数值j的绝对值的。
我们就可以写这样一个程序了:

#include <stdlib.h> /* 把上面的复制下来而已 */
#include <stdio.h> /* 因为我们要向屏幕输出信息用到printf函数,man 3 printf会知道需要这个头文件 */
int main(int argc, char ** argv)
{
    int x, y;
    x = -321;
    y = abs(x);
    printf("abs(x)=%d\n", y);
    return 0;
}
用gcc编译程序吧:
gcc abs.c
运行程序:
./a.out
此程序将计算出x变量的绝对值输出到屏幕。

又比如:man 3 sin可能会看到:

NAME
       sin, sinf, sinl - sine function

SYNOPSIS
       #include <math.h>

       double sin(double x);
       float sinf(float x);
       long double sinl(long double x);

       Link with -lm.

DESCRIPTION
       The sin() function returns the sine of x, where x is given in radians.

RETURN VALUE
       The sin() function returns a value between -1 and 1.
同样照着做吧:

#include <math.h> /* 把上面的复制下来而已 */
#include <stdio.h> /* 因为我们要向屏幕输出信息用到printf函数,man 3 printf会知道需要这个头文件 */
int main(int argc, char ** argv)
{
    double x, y;
    x = 60;
    y = sin(x);
    printf("sin(x)=%.2f\n", y);
    return 0;
}
编译程序用下列命令:
gcc sin.c -lm
注意这里比上面的编译命令多了一个-lm,我怎么知道的?上面man手册告诉我的:“Link with -lm.”因为我们用到了数学库/usr/lib/libm.so,所以要加上-lm来引用这个库文件。
运行程序吧:
./a.out
此程序将输出弧度为60度的正弦值。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多