我是这样学习Linux下C语言编程的-自我学会利用Linux系统上已有的开发库
2012-12-24 14:51
841 查看
我是这样学习Linux下C语言编程的-自我学会利用Linux系统上已有的开发库
关键词: LinuxC语言
库文件 gzip
压缩
1、查看库文件是由哪个软件包提供的
空闲时打开/usr/lib目录(因为我知道这个目录下放着一些库文件,是我们开发者可以利用的)想看看我的系统中有哪些库。
看到一个libz.so,于是用命令查看:
dpkg -S /usr/lib/libz.so |
zlib1g-dev: /usr/lib/libz.so |
2、查看软件包的详细信息
可以用下列命令查看此软件包是干什么的:
apt-cache show zlib1g-dev |
Description: compression library - development zlib is a library implementing the deflate compression method found in gzip and PKZIP. This package includes the development support files. Bugs: mailto:ubuntu-users@lists.ubuntu.com Origin: Ubuntu |
继续用下面的命令查看zlib1g-dev软件包的详细信息:
dpkg -L zlib1g-dev |
/. /usr /usr/lib /usr/lib/libz.a /usr/include /usr/include/zlib.h /usr/include/zconf.h /usr/share /usr/share/doc /usr/share/doc/zlib1g-dev /usr/share/doc/zlib1g-dev/examples /usr/share/doc/zlib1g-dev/examples/example.c.gz /usr/share/doc/zlib1g-dev/examples/contrib.tar.gz /usr/share/doc/zlib1g-dev/examples/minigzip.c.gz /usr/share/doc/zlib1g-dev/changelog.gz /usr/share/doc/zlib1g-dev/FAQ.gz /usr/share/doc/zlib1g-dev/README.gz /usr/share/doc/zlib1g-dev/copyright /usr/share/doc/zlib1g-dev/changelog.Debian.gz /usr/share/doc/zlib1g-dev/algorithm.txt.gz /usr/share/man /usr/share/man/man3 /usr/share/man/man3/zlib.3.gz /usr/lib/libz.so |
如果把example.c.gz、minigzip.c.gz两个例子程序完全弄懂了,你就肯定会自己写程序进行压缩和解压缩工作了。
3、查看库文件提供了哪些调用
如果我们不看上面的软件包信息中提供的源代码例子,也可以用nm命令自己查看库文件提供了哪些调用。
比如我们用下面的nm命令查看libz.so库文件提供哪些调用:
nm -D /usr/lib/libz.so |
00001810 T adler32 00001ad0 T adler32_combine 00013b30 A __bss_start U clearerr 00001c70 T compress 00001ba0 T compress2 00001b80 T compressBound 00001cd0 T crc32 00002320 T crc32_combine w __cxa_finalize 00005da0 T deflate 00005150 T deflateBound 00004bb0 T deflateCopy 000107e0 R deflate_copyright 00004890 T deflateEnd 00005640 T deflateInit_ 00005360 T deflateInit2_ 00006b80 T deflateParams 00004810 T deflatePrime 000051c0 T deflateReset 00004fe0 T deflateSetDictionary 000047e0 T deflateSetHeader 00004850 T deflateTune 00010820 R _dist_code 00013b30 A _edata 00013b34 A _end U __errno_location U fclose U fdopen U feof U ferror U fflush 0000e784 T _fini U fopen U fprintf U fputc U fread U free U fseek U ftell U fwrite 00001cb0 T get_crc_table w __gmon_start__ 00002570 T gzclearerr 00002b50 T gzclose 00002550 T gzdirect 00003ba0 T gzdopen 00002520 T gzeof 000025b0 T gzerror 00002d40 T gzflush 000046c0 T gzgetc 00004640 T gzgets 00003c20 T gzopen 00002a10 T gzprintf 00002900 T gzputc 000028c0 T gzputs 00003c40 T gzread 00002950 T gzrewind 00004410 T gzseek 00002ab0 T gzsetparams 00004600 T gztell 000024d0 T gzungetc 000027d0 T gzwrite 0000a490 T inflate 0000c4e0 T inflateBack 0000c490 T inflateBackEnd 0000c390 T inflateBackInit_ 0000a000 T inflateCopy 00012720 R inflate_copyright 00009f40 T inflateEnd 0000e1c0 T inflate_fast 00009fa0 T inflateGetHeader 00009f00 T inflateInit_ 00009df0 T inflateInit2_ 00009da0 T inflatePrime 00009d00 T inflateReset 0000a380 T inflateSetDictionary 0000c1a0 T inflateSync 00009fd0 T inflateSyncPoint 0000d770 T inflate_table 000013d0 T _init w _Jv_RegisterClasses 00010a20 R _length_code U malloc U memcpy U memset U sprintf U __stack_chk_fail U strcat U strcpy U strerror U strlen 00008390 T _tr_align 00009240 T _tr_flush_block 000074e0 T _tr_init 00008210 T _tr_stored_block 00007c10 T _tr_tally 00004710 T uncompress U vsnprintf 00009cd0 T zcalloc 00009ca0 T zcfree 00013900 D z_errmsg 00009c70 T zError 00009c60 T zlibCompileFlags 00009c40 T zlibVersion |
关于nm的详细用法可以参考man nm手册,我们在这里先只关心一下第二列为T的,即类型为T的,这是我们的应用程序可以调用的。
/************关于本文档********************************************
*filename: 我是这样学习Linux下C语言编程的-自我学会利用Linux系统上已有的开发库
*purpose: 说明怎样利用Linux中已有的库文件进行开发
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-02-06 20:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to:Google
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/
同时由于我们只关心gzip压缩和解压缩方法的使用,我们可以用命令过滤一下:
nm -D /usr/lib/libz.so | grep gz |
00002570 T gzclearerr 00002b50 T gzclose 00002550 T gzdirect 00003ba0 T gzdopen 00002520 T gzeof 000025b0 T gzerror 00002d40 T gzflush 000046c0 T gzgetc 00004640 T gzgets 00003c20 T gzopen 00002a10 T gzprintf 00002900 T gzputc 000028c0 T gzputs 00003c40 T gzread 00002950 T gzrewind 00004410 T gzseek 00002ab0 T gzsetparams 00004600 T gztell 000024d0 T gzungetc 000027d0 T gzwrite |
4、查看函数的定义
打开/usr/include/zlib.h,搜索上面出现的这些函数,你很快会找gzopen的说明的:
ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ |
同样,我们会看到上面所有函数的说明:
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); ZEXTERN int ZEXPORT gzclose OF((gzFile file)); …… |
有了上面这些信息,我们就可以自己写程序来使用库文件提供的所有东西了。比如下面的代码:
#include <zlib.h> /* 因为 gz 相关的函数在这个头文件中定义的 */ #include <zconf.h> #include <stdio.h> /* 因为 printf 相关的函数在这个头文件中定义的 */ #include <errno.h> /* 因为 errno 相关的函数在这个头文件中定义的 */ #include <stdlib.h> /* 因为 exit 函数在这个头文件中定义的 */ #include <string.h> /* 因为 strlen 函数在这个头文件中定义的 */ int main(int argc, char **argv) { gzFile mygzfp; mygzfp = gzopen(argv[1], "w"); if(mygzfp == NULL) { printf("以写方式打开文件'%s'出错,错误信息:%s", argv[1], strerror(errno)); exit(0); } gzwrite(mygzfp, argv[2], strlen(argv[2])); gzclose(mygzfp); return 0; } |
gcc gzfile.c -lz
注意:为了引用libz.so这个库文件,我们必须用-lz。
运行这个命令:
./a.out mygzfile.gz "hello, 这是一个自己生成压缩文件的测试程序。"
将在当前目录下生成一个文件名为mygzfile.gz的压缩文件。
你可以打开此压缩文件看看,里面是不是你自己写进去的信息呢
相关文章推荐
- 自我学会利用Linux系统上已有的开发库
- 自我学会利用Linux系统上已有的开发库
- 自我学会利用Linux系统上已有的开发库
- 我是这样学习Linux下C语言编程的-把程序输出信息加到系统日志里去
- 我是这样学习Linux下C语言编程的-把程序输出信息加到系统日志里去
- 我是这样学习Linux下C语言编程的-把程序输出信息加到系统日志里去
- 嵌入式系统开发学习步骤(Linux高级编程学习顺序)
- 自我学会利用Linux系统上已有的开发库
- 嵌入式系统开发学习步骤(Linux高级编程学习顺序)(zz)
- 对于安卓开发、Java学习、编程自我深造可以利用的网址、文章等第三方途径
- 我是这样学习Linux下C语言编程的-Linux下C语言编程环境的搭建
- socket编程的最简单实例 - linux系统编程及驱动开发 - 小超嵌入式工作室 嵌入式开发学习交流论坛 XC-STC XC2440技术支持 - Powered by Discuz!
- 嵌入式系统开发学习步骤(Linux高级编程学习顺序)
- 我是这样学习Linux下C语言编程的-RPC远程调用编程
- 我是这样学习Linux下C语言编程的-编译命令gcc的使用
- 我是这样学习Linux下C语言编程的-RPC远程调用编程
- 我是这样学习Linux下C语言编程的-完全认识GNU C 语言库glibc
- 我是这样学习Linux下C语言编程的-完全认识GNU C 语言库glibc
- Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)
- Linux学习记录--文件IO操作相关系统编程