Google的C语言编程站点目录

http://www.google.com/Top/Computers/Programming/Languages/C/FAQs,_Help,_and_Tutorials/

man手册页的阅读

什么是man手册

首先,man是manual的简称,中文说法可以是手册。 许多Linux的新手经常会因为一些命令的使用或函数的使用不清楚而发帖求助,老鸟们在回帖的时候一般都喜欢用“man XXX”来回复。于是,新手在终端上敲入了man XXX,然后屏幕上出现了密密麻麻的英文。。。

这些英文就是最好的帮助和说明,下面用一个man的手册页截图为例来说明man手册的基本组成。

上面的是一个API函数strcmp的man手册页,首先注意到红色标记部分的数字是这个手册页所属的section标记,关于section的说明,请往下看。 这个手册页由这几个部分组成: '''NAME'''

这是命令的名字和简单的解释,显然,要调用这个函数要使用它的名称。

'''SYNOPSIS'''

是摘要部分,在这里给出的是函数所在的头文件和函数声明原型。

'''DESCRIPTION'''

函数的详细说明。

'''RETURN VALUE'''

返回值解释说明

'''CONFORMING TO'''

遵循的语言规范。

'''SEE ALSO'''

相关的其他函数。

如果是命令的man手册页,结构上会有所不同,一般来说命令的手册页会有OPTIONS一节,对命令的所有参数进行解释,有些命令还有附带的EXAMPLES方便理解。

除此之外,以mkdir的man手册页为例:

mkdir [OPTION] DIRECTORY...

上面的方括号内的参数是可选的,而没有方括号包围的参数则是必填参数,如这里的DRIRECTORY。而后面的...表示DIRECTORY参数可以多次出现,即有多个DIRECTORY参数

man手册的基本结构

{| cellspacing="1" cellpadding="1" border="1" align="center" width="800" |+ man手册页的结构 |- | Section | 名称 | 说明 |- | 1 | 用户命令 | 可由任何人调用的程序或工具 |- | 2 | 系统调用 | 内核提供的函数API接口 |- | 3 | API | 用户态函数API接口 |- | 4 | 设备 | /dev目录下的特殊文件 |- | 5 | 文件格式描述 | 如/etc/passwd |- | 6 | 游戏 | ... |- | 7 | 杂项 | 例如宏命令包,惯例等 |- | 8 | 系统管理工具 | root调用的程序或工具 |- | 9 | 其他(Linux特定的) | 用来存放内核例行程序的文档 |- | n | 新文档 | 可能要移到更适合的领域 |- | o | 老文档 | 可能会在一段期限内保留 |- | l | 本地文档 | 与本特定系统有关的 |}

man手册基本使用

1. 简单查询

man <keyword>

man printf

2. 按节查询

man <section> <keyword>

前面已经说过,man手册页是按照手册页的内容进行分类的。所以,就会存在同一个关键词在不同节出现的情况。对于这种多次出现的关键词,我们就需要进一步缩小检索范围。比如open,既是一个用户命令,也是一个系统调用,甚至还是Perl的一个函数。所以我们在进行查找的时候就有必要加上section标识,如查找open的系统调用说明,就使用

man 2 open

3. 模糊查询 有时,我们想查询一个关键词的man手册页,但是不知道这个关键词的完整名称或者这个关键词根本就没有man手册页,但是有其他格式的帮助文档。这时候,就可以通过以下命令来进行查找:

man -k <keyword>

上面的命令等价于apropos,关于apropos这个命令有什么用,就自己man去吧o(∩_∩)o

以open为例,在man手册页里有多节内容是关于open的,如果我们不清楚我们要查询的open到底在哪一节里出现,就可以用下面的命令进行查询:

man -a <keyword>

4.退出man

q

5.在手册页内查找

只要会用vim的人,就会在man里面进行查找。/进入查找模式,输入关键词,回车。n或p向后或向前查找。

6.在手册页内翻页

除了方向键和PageUP、PageDown,还可以使用空格(后翻一页)、回ogramming 3rd.pdf] 的第12章 POSIX Threads


Category:技术文档Category:帮助文档

== 关于malloc的使用 -o hash.o

step 2: 由obj文件创建静态库

静æ

<nowiki># gcc -shared -fPCI -o libcommonds.so hash.o</nowiki>

step 3: 在程序中使用动态库

在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令田同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。


&»Ÿ资源限制操作相关的C API]]

Linux系统终端相关的C API

Linux系统终端相关的C API

文件锁

(1)使用open系统调用,设置打开参数为O_EXCL。这种文件锁的方式打开的文件是对整个文件加锁。

(2)使用fcntl系统调用。这种文件锁的方式打开的文件是对文件分区域加锁。

(3)使用lockf函数。这种文件锁的方式打开的文件是对文件分区域加锁。

检查可执行文件中的所有共享库文件的依赖是否可以正确的找到

ldd 可执行文件

如何查看ld的搜索路径

huangwei@isc-ubuntu:~/download$ '''ld --verbose | grep SEARCH'''

SEARCH_DIR("/usr/i486-linux-gnu/lib32");

SEARCH_DIR("/usr/local/lib32"); SEARCH_DIR("/lib32");

SEARCH_DIR("/usr/lib32");

SEARCH_DIR("/usr/i486-linux-gnu/lib");

SEARCH_DIR("'''/usr/local/lib'''");

SEARCH_DIR("/lib");

SEARCH_DIR("'''/usr/lib'''");

glib和glibc的关系

GLib is a general-purpose utility library, which provides many useful data types, macros, type conversions, string utilities, file utilities, a main loop abstraction, and so on. It works on many UNIX-like platforms, Windows, OS/2 and BeOS. GLib is released under the GNU Library General Public License (GNU LGPL).

The general policy of GLib is that all functions are invisibly threadsafe with the exception of data structure manipulation functions, where, if you have two threads manipulating the same data structure, they must use a lock to synchronize their operation.

GLib是Gtk +库和Gnome的基础。GLib可以在多个平台下使用,比如Linux、Unix、Windows等。GLib为许多标准的、常用的C语言结构提供了相应的替代物。

GLib中定义了好多有用的数据结构,如单(双)向连表,可变长的数组等,线程池等有用的东西。使用GLib库的程序都应该包含GLib的头文件glib.h。

GLIBC

The GNU C library is primarily designed to be a portable and high performance C library.

It follows all relevant standards (ISO C 99, POSIX.1c, POSIX.1j, POSIX.1d, Unix98, Single Unix Specification). It is also internationalized and has one of the most complete internationalization interfaces known.

Glibc 是提供系统调用和基本函数的 C 库,比如open, malloc, printf等等。所有动态连接的程序都要用到它。是GNU开发的C库。

他们之间在用途上没有太大关系。

为何在程序出现段错误等严重内存错误时系统无法生成core dump文件?

使用ulimit -c,如果返回0,则说明系统禁止生成core dump文件。设置合适大小的core dump最大值即可。如ulimit -c 1000,(maximum core file size (in 512-byte blocks))

如何使用core dump文件来定位程序出错位置和出错信息?

'''step 1: '''加载可执行文件崩溃时所产生的'''core dump'''文件

<nowiki>gdb <program> -c <coredump_filename></nowiki>

或者,可以在gdb启动之后使用命令

<nowiki>target core <coredump_filename></nowiki>

'''step 2: '''定位程序错误

(gdb) '''where'''

#0 0x0804bffd in IP_CheckSum (psIPHeader=0xe) at public_protocol_analyse.c:145

#1 0x0804c086 in IP_HandleHeadInfo (psIPHeader=0xe) at public_protocol_analyse.c:179

#2 0x08051f55 in Handle_IPLayer (pcPktIP=0xe <Address 0xe out of bounds>) at interface.c:41

#3 0x0804a4c6 in preProcessPkt (args=0x8f82138) at t_mmain.c:267

#4 0xb7f7c50f in start_thread () from /lib/tls/i686/cmov/libpthread.so.0

#5 0xb7ef8a0e in clone () from /lib/tls/i686/cmov/libc.so.6

从上面的例子中可以看到程序的出错位置(具体到源代码中的位置)和出错信息(出错时的函数堆栈调用信息)一目了然。当然,之所以能够定位程序出错信息到具体的源代码级别,必须要在程序编译时加入调试信息(如gcc使用-g参数),否则无法获得源代码级别的详细信息。

除了where之外,更“正统”的函数调用堆栈信息查询命令是backtrace(简写为bt)或info stack。如果查看某一个具体函数栈帧的信息,可以使用GDB命令frame <frame_no>。

查看系统当前正在使用的glibc版本

strings /lib/libc.so.6 | grep a = pb; } int main() {

int *pa = 2; *pa = 1; change1(&pa);

˜¯在/usr/include/bits/typesizes.h中定义的宏__FD_SETSIZE #define __FD_SETSIZE 1024

提高select()机制实现的并发服务程序的并发连接数限制

方法(1):修改__FD_SETSIZE定义,重新编译内核

方法(2):采用多进程方案(参考apache的1.3.x的并发实现)

如何在C++代码中包含C头文件

参考http://www.sunistudio.com/cppfaq/mixing-c-and-cpp.html

逐步完善

如何从C++代码中调用非系统C函数f(int,char和float)?

参考http://www.sunistudio.com/cppfaq/mixing-c-and-cpp.html

逐步完善

如何创建一个C + + 函数f(int,char和float),可以由我的C代码调用?

参考http://www.sunistudio.com/cppfaq/mixing-c-and-cpp.html

逐步完善

如何传递一个C + + 类对象从/到一个C函数?

参考http://www.sunistudio.com/cppfaq/mixing-c-and-cpp.html

逐步完善

内联函数能改善性能么?

http://www.sunistudio.com/cppfaq/inline-functions.html

逐步完善

内联函数和宏定义方式的区别与使用注意事项

http://www.sunistudio.com/cppfaq/inline-functions.html

逐步完善

返回顶部