﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-依睛(IT blog) 我回来了，PHP&lt;--&gt;C/C++ LINUX-随笔分类-UNIX</title><link>http://www.cnitblog.com/guopingleee/category/5618.html</link><description>笨鸟
</description><language>zh-cn</language><lastBuildDate>Mon, 03 Oct 2011 16:37:28 GMT</lastBuildDate><pubDate>Mon, 03 Oct 2011 16:37:28 GMT</pubDate><ttl>60</ttl><item><title>线程同步(两个线程同步 加锁)</title><link>http://www.cnitblog.com/guopingleee/archive/2008/11/17/51552.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Mon, 17 Nov 2008 05:38:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2008/11/17/51552.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/51552.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2008/11/17/51552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/51552.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/51552.html</trackback:ping><description><![CDATA[
		<p>
				<br />啊....同步终于搞清了, 晕死了....<br /><br />这东西真让我难解, 太笨了...可惜没有一本书来看, 时间太急.....<br /><br />两个线程同步 加锁<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;pthread.h&gt;<br />#include &lt;errno.h&gt;<br />#include &lt;semaphore.h&gt;<br />#define BUFSIZE 4<br />#define NUMBER 8</p>
		<p>int sum_of_number=0;<br />int value=0; //全局变量, 要注意加锁</p>
		<p>
				<br />/*定义两个变量 信号量*/<br />sem_t write_res_number;<br />sem_t read_res_number;</p>
		<p> </p>
		<p>/* 初始化锁 ¯*/<br />pthread_mutex_t buffer_mutex=PTHREAD_MUTEX_INITIALIZER;</p>
		<p>static void *producer(void * arg)<br />{<br />    int i;<br />    <br />    for(i=0;i&lt;=12;i++)<br />    {<br />        /* 减少可写的资源数*/<br />        sem_wait(&amp;write_res_number);<br />        <br />        /* 加锁 */<br />        pthread_mutex_lock(&amp;buffer_mutex);<br />             <br />        value+=1;<br />        printf("procuder write: %d\n",value);<br />        <br />        /* 解锁 */<br />        pthread_mutex_unlock(&amp;buffer_mutex);<br />        <br />                sem_post(&amp;read_res_number);<br />    }<br />    return NULL;<br />}</p>
		<p>static void * consumer(void * arg)<br />{<br />    int i,num;<br />    <br />    for(i=0;i&lt;=12;i++)<br />    {<br />        sem_post(&amp;write_res_number);<br />        sem_wait(&amp;read_res_number);</p>
		<p>        pthread_mutex_lock(&amp;buffer_mutex);     <br />        value+=1;<br />        printf("read value %d.\n",value);<br />        <br />          pthread_mutex_unlock(&amp;buffer_mutex);      <br />    }        <br />    return NULL;<br />}</p>
		<p>int main(int argc,char ** argv)<br />{<br />     pthread_t p_tid;<br />    pthread_t c_tid;<br />    <br />    sem_init(&amp;write_res_number,0,0); <br />    sem_init(&amp;read_res_number,0,0);<br />    <br />       pthread_create(&amp;p_tid,NULL,producer,NULL);<br />    pthread_create(&amp;c_tid,NULL,consumer,NULL);<br />    <br />       pthread_join(p_tid,NULL);<br />    pthread_join(c_tid,NULL);<br />    <br />    pthread_mutex_destroy(&amp;buffer_mutex); /*ÊÕ»Ø»¥³âÁ¿×ÊÔ´*/<br />}<br /><br />在linux 下一样.<br />我在cygwin  运行结果: <br />$ gcc -lpthread -o th th<br />$ ./th<br />procuder write: 1<br />read value 2.<br />procuder write: 3<br />read value 4.<br />procuder write: 5<br />read value 6.<br />procuder write: 7<br />read value 8.<br />procuder write: 9<br />read value 10.<br />procuder write: 11<br />read value 12.<br />procuder write: 13<br />read value 14.<br />procuder write: 15<br />read value 16.<br />procuder write: 17<br />read value 18.<br />procuder write: 19<br />read value 20.<br />procuder write: 21<br />read value 22.<br />procuder write: 23<br />read value 24.<br />procuder write: 25<br />read value 26.<br />$<br /><br /></p>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/51552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2008-11-17 13:38 <a href="http://www.cnitblog.com/guopingleee/archive/2008/11/17/51552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C 常用的 Linux C 语言函数库</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/13/31703.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Mon, 13 Aug 2007 05:16:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/13/31703.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31703.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/13/31703.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31703.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31703.html</trackback:ping><description><![CDATA[附录 C 常用的 Linux C 语言函数库<br /><br />本附录列出 Linux 的常见发行版（如 RedHat Linux）中包含的函数库。除特别指<br />出外，这些函数库的使用和发行适用 GPL 条款或 LGPL 条款。<br /><br />需要注意的是，Linux 上的函数库正在以非常快的速度增加和更新，这里列出的函<br />数库只是其中的一小部分。如果读者要在 Linux 上进行开发，最好先了解一些是否有<br />一些可供直接利用的函数库，以避免重复开发。有关 Linux 上的应用和函数库开发<br />，可访问如下站点：<br /><br /><a href="http://www.linux.org/" target="_blank"><font color="#0000f0">http://www.linux.org</font></a><br /><a href="http://www.linuxstart.com/" target="_blank"><font color="#0000f0">http://www.linuxstart.com</font></a><br /><a href="http://www.linuxnow.com/" target="_blank"><font color="#0000f0">http://www.linuxnow.com</font></a><br /><a href="http://www.linuxresource.com/" target="_blank"><font color="#0000f0">http://www.linuxresource.com</font></a><br /><a href="http://www.ee.mu.oz.au/linux/programming/" target="_blank"><font color="#0000f0">http://www.ee.mu.oz.au/linux/programming/</font></a>The Linux Programmer’s BounceP<br />oint)<br /><br />C.1 CrackLib<br /><br />CrackLib 为用户提供了一个 C 语言函数接口，利用这一函数，可避免用户选择容<br />易破解的密码。该函数库可在类似 passwd 的程序中使用。<br /><br />C.2 GLib<br /><br />GLib 作为 GTK+ 的一个组件，提供了操作通用数据结构，如链表、树、哈希表、内<br />存分配等等在内的 C 函数库。<br /><br />C.3 glibc<br /><br />众所周知，C 语言并没有为常见的操作，例如输入/输出、内存管理，字符串操作等<br />提供内置的支持。相反，这些功能一般由标准的“函数库”来提供。<br /><br />GNU 的 C 函数库，即 glibc，定义了 ISO C 标准指定的所有的库函数，以及由 PO<br />SIX 或其他 UNIX 操作系统变种指定的附加特色，还包括有与 GNU 系统相关的扩展<br />。<br /><br />glibc 基于如下标准：<br /><br /><br />ISO C：C 编程语言的国际标准。GNU C 函数库与美国国家标准局（ANSI）公布的 C<br /> 标准兼容。这一标准后来被国际标准化组织所接收（ISO/IEC 9899:1990）。<br /><br /><br />POSIX：操作系统的 ISO/IEC 9945(即 IEEE 1003)标准。GNU C 函数库实现了 ISO/<br />IEC 9945-1:1996 （POSIX 系统应用程序编程接口，即 POSIX.1）指定的所有函数。<br />该标准是对 ISO C 的扩展，包括文件系统接口原语、设备相关的终端控制函数以及<br />进程控制函数。同时，GUN C <br />函数库还支持部分由 ISO/IEC 9945-2:1993（POSIX Shell 和 工具标准，即 POSIX<br />.2）指定的函数，其中包括用于处理正则表达式和模式匹配的函数。<br /><br /><br />Berkeley Unix：BSD 和 SunOS。GNU C 函数库定义了某些 UNIX 版本中尚未标准化<br />的函数，尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系统（即“Berkeley Unix”)以<br />及“SunOS”（大众化的 4.2 BSD 变种，其中包含有某些Unix System V 的功能）。<br />BSD 函数包括符号链接、select <br />函数、BSD 信号处理函数以及套接字等等。<br /><br /><br />SVID：System V 的接口描述。System V 接口描述（SVID）是描述 AT&amp;T Unix Syst<br />em V 操作系统的文档，它是对 POSIX 标准的扩展超集。GNU C 函数库定义了大多数<br />由 SVID 指定而未被 ISO C 和 POSIX 标准指定的函数。来自 System V <br />的支持函数包括进程间通信和共享内存、hsearch 和 drand48 函数族、fmtmsg 以<br />及一些数学函数。<br /><br /><br />XPG：X/Open 可移植性指南。X/Open 可移植性指南（由 X/Open Company, Ltd.出<br />版），是比 POSIX 更为一般的标准。X/Open 拥有 Unix 的版权，而 XPG 则指定成为<br /> Unix 操作系统必须满足的需求。GNU C 函数库遵循 X/Open 可移植性指南（Issue <br />4.2）以及所有的 XSI（X/Open <br />系统接口）兼容系统的扩展，同时也遵循所有的 X/Open Unix 扩展。<br /><br />C.4 Imlib<br /><br />Imlib 是一个一般性的图象装载和渲染库。利用 Imlib，可简化在 X-Window 系统<br />中装载图象并获得可绘制对象的工作。它提供了图象渲染的快速操作函数，同时也为 <br />＜耐枷蟛僮魈峁┘虻サ牟僮骼獭 <br /><br />Imlib 的特色有：<br /><br /><br />在完整编译的情况下，Imlib 可在无其他应用程序的帮助下，装载 PPM、PGM、TIFF<br />、PNG、XPM、JPEG 和 EIM 格式的图象，并保留它们的透明特征。对于一些 Imlib <br />并不支持的图象格式，它可依赖一组系统工具将这些图象格式转换为 Imlib 可理解的<br />格式，然后进行处理，这样，Imlib <br />能够处理其他工具所能支持的任意格式。当前，Imlib 支持 Imagemagick 和 PBMPL<br />US 工具。利用外来工具时，装载过程要慢一些。<br /><br /><br />Imlib 拥有图象缓存功能。程序员可以编写一些直接性的代码，而不需要过多考虑<br />性能问题。图象被装入之后，会缓存起来。如果图象仍然在缓存中，就没有必要重新 <br />叭肓耍恍璐踊捍嬷幸酶猛枷蟆Ｓ谑牵势拥闹苯有源肽芄槐３纸峡斓闹葱兴<br />俣取 <br /><br /><br />Imlib 可以对图象进行任意倍数的缩放（限制在 32767 x 32767 象素）。这意味着<br />仅通过一个函数调用，就可以将小的图标放大，或者将大的图象缩减为指甲大小的图<br />象。<br /><br /><br />Imlib 可通过灰度、亮度、对比度或任意的曲线映射关系提高图象的可视度，或修<br />饰其外观。它允许进行灰度校正、白点校正或其他高级特色，而不需要其他硬件支持 <br /><br /><br /><br />Imlib 可完成基本的图象修饰（翻转、旋转等）。<br /><br /><br />Imlib 经过严格的优化，因此可以最高的速度获得最好的结果。根据 X Server 和<br />硬件的能力，可选择不同的选项提高其渲染处理的速度。<br /><br /><br />Imlbi 可处理许多显示深度。能够在单色、2、3、4、5、6、7、8 位的伪色彩以及<br />静态颜色的系统上工作。它也可以在 15 位、16 位（555 和 565）、以及 24 位的色<br />彩系统上工作。<br /><br /><br />在对图象以不同的大小进行渲染时，Imlib 具有高级的 pixmap 缓存，可以重复使<br />用，进而提供渲染速度。<br /><br /><br />Imlib 分别具有 Xlib 和 GDK 的版本，也可以同时安装。这两个版本共享同一个配<br />置文件。<br /><br />C.5 libgHTTP<br /><br />HTTP 是针对 WWW 底层传输机制的协议。该协议具有良好的文档并被广泛实现。而<br />该协议的使用通常和 Web 联系在一起，但该协议的使用却可以扩展到任何一个适合的<br />地方。libgHTTP 就是一个完全和 HTTP 1.1 （RFC 2068 的第五次修改草案中定义）<br />兼容的函数库。libgHTTP <br />的设计非常简单而且易于使用。 <br /><br />C.6 LibGTop<br /><br />LibGTop 是一个能够获取进程信息以及系统运行信息的函数库，这些信息包括：<br /><br /><br />系统的一般信息<br /><br /><br />cpu - CPU 的使用信息<br /><br /><br />mem - 内存使用信息<br /><br /><br />swap - 交换使用信息（包括分页活动）<br /><br /><br />loadavg - 负载的平均水平（包括可运行进程数目、进程总数目和上一次运行的进<br />程标识号等）<br /><br /><br />uptime - 启动后的时间以及空闲时间，可从 CPU 的使用信息中计算得到。<br /><br /><br />SYS V IPC 限制<br /><br /><br />shm_limits - 共享内存的限制信息<br /><br /><br />msg_limits - 消息队列的限制信息<br /><br /><br />sem_limits - 信号量的限制信息<br /><br /><br />进程列表<br /><br /><br />proclist - 进程列表<br /><br /><br />进程信息<br /><br /><br />proc_state - cmd, state, uid, gid<br /><br /><br />proc_uid - uid, euid, gid, egid, pid, ppid, pgrp session, tty, tpgid, pri<br />ority, nice<br /><br /><br />proc_mem - size, vsize, resident, share, rss, rss_rlim<br /><br /><br />proc_time - start_time, rtime, utime, stime, cutime, cstime, timeout, it_<br />real_value, frequency<br /><br /><br />proc_signal - signal, blocked, sigignore, sigcatch<br /><br /><br />proc_kernel - k_flags, min_flt, maj_flt, cmin_flt, cmaj_flt, kstk_esp, ks<br />tk_eip, nwchan, wchan<br /><br /><br />proc_segment - text_rss, shlib_rss, data_rss, stack_rss, dirty_size start<br />_code, end_code, start_stack<br /><br /><br />进程映射<br /><br /><br />proc_map - 进程映射（Linux 下的/proc/&lt;pid&gt;/映射<br /><br /><br />文件系统使用信息:<br /><br /><br />mountlist - 当前挂装文件系统列表<br /><br /><br />fsusage - 文件系统使用信息<br /><br />C.7 libpng<br /><br />PNG 指可移植的网络图象文件格式（Portable Network Graphic）。libpng 则是 P<br />NG 规范对应的 C 函数库，其目的是减少在应用程序中为支持 PNG 文件格式而需要<br />花费的时间和精力。PNG 规范（RFC 2083）以及相关文档、最新的 libpng 库可从如<br />下站点获得：<br /><br /><a href="ftp://ftp.uu.net/graphics/png/documents/" target="_blank"><font color="#0000f0">ftp://ftp.uu.net/graphics/png/documents/</font></a><br /><img src="http://www.w3.org/TR/REC.png.html" /><br />图片url地址  <a href="http://www.w3.org/TR/REC.png.html"><font color="#0000f0">http://www.w3.org/TR/REC.png.html</font></a><br /><a href="ftp://ftp.uu.net/graphics/png/documents/" target="_blank"><font color="#0000f0">ftp://ftp.uu.net/graphics/png/documents/</font></a><br /><a href="http://www.cdrom.com/pub/png/" target="_blank"><font color="#0000f0">http://www.cdrom.com/pub/png/</font></a><br /><br />libpng 的最终目的是，在任何需要使用 PNG 文件格式的地方均能够获得 libpng <br />的支持。libpng 有如下特色：<br /><br /><br />可同时处理多个会话。<br /><br /><br />易于修改。<br /><br /><br />可移植到许多不同的平台上，包括ANSI、K&amp;R、16-位、32-位以及 64-位等。<br /><br /><br />易于使用。<br /><br /><br />是线程安全的，可用于多线程的应用程序。<br /><br />需要注意的是，libpng 使用 zlib 完成 PNG 文件的压缩和解压，因此，系统中需<br />要安装有 zlib 库（下面讲述）。<br /><br />C.8 libtiff<br /><br />libtiff 提供了对 TIFF（Tag Image File Format）的支持。TIFF 是广泛用于保存<br />图象数据的格式。libtiff 包含如下功能：<br /><br /><br />读写 TIFF 的函数接口。<br /><br /><br />提供了在 UNIX 系统上对 TIFF 图象进行简单操作的工具。<br /><br />C.9 GNU Libtool<br /><br />GNU Libtool 实际是一个脚本生成工具，它可以为软件包开发者提供一般性的共享<br />库支持。<br /><br />以前，如果源代码包的开发者要利用共享库的优点，则必须为每个软件包可支持的<br />平台编写定制的支持代码。并且还需要设计配置接口，以便软件包的安装程序能够正 <br />费≡褚⒌目饫嘈汀＠?GNU <br />Libtool，则可以简化开发者的这一工作。它在一个单独的脚本中同时封装了与平台<br />相关的依赖性以及用户界面。GNU Libtool 可使每个宿主类型的完整功能可通过一般<br />性的接口获得，同时为程序员隐藏了宿主的特殊性。<br /><br />GNU Libtool 一致性接口是可靠的，用户不必阅读那些晦涩的文档，以便在每个平<br />台上建立共享库。他们只需运行软件包的配置脚本，而由 libtool 完成繁复的工作。<br /><br />C.10 libungif<br /><br />GIF 是指 Graphics Interchange Format 规范。libungif 包含了一组用来处理 GI<br />F 图象的可移植工具和库例程。最新版本可从如下站点获得；<br /><br /><a href="http://www.ccil.org/~esr/giflib" target="_blank"><font color="#0000f0">http://www.ccil.org/~esr/giflib</font></a><br /><br />libungif包含了用来剪切、旋转、缩放和定位 GIF 图象的程序。包括一个 X11 查<br />看器、将 GIF 输出到 Epson 兼容打印机的的代码，以及许多转换工具。<br /><br />函数库中包括了读取和写入 GIF 文件的库例程，在 GIF 文件中嵌入 8x8 字体的工<br />具函数，以及错误处理例程等。<br /><br />C.11 svgalib<br /><br />svgalib 是一个底层图形库，可在 Linux 的虚拟终端上运行。svgalib 支持许多常<br />见的 SVGA 卡，包括 Trident TVGA 9440、S3 Trio64 等。<br /><br />SVGA 包括如下功能：<br /><br /><br />函数库的初始化；<br /><br /><br />查询硬件配置，包括鼠标、芯片组和监视器；<br /><br /><br />设置显示模式；<br /><br /><br />获取显示模式信息；<br /><br /><br />绘图原语，包括画点、扫描线等基本绘图功能；<br /><br /><br />基本的键盘 I/O，区别于原始（RAW）模式；<br /><br /><br />直接的 VGA 内存访问；<br /><br /><br />颜色调色板支持；<br /><br /><br />鼠标处理支持；<br /><br /><br />原始键盘处理，以原始访问读取键盘设备，从而可获得对键盘的完全控制；<br /><br /><br />游戏棒支持；<br /><br /><br />虚拟终端切换功能；<br /><br /><br />SVGA 卡的加速特性支持等。<br /><br />C.12 zlib<br /><br />zlib 是一个通用的数据压缩库。代码是线程安全的，可用于支持多线程应用程序。<br /><br />zlib 库支持的数据格式包括RFC 1950 到 1952 中描述的文件格式：<br /><br /><br />zlib 格式，由<a href="ftp://ds.internic.net/rfc/rfc1950.txt" target="_blank"><font color="#0000f0">ftp://ds.internic.net/rfc/rfc1950.txt</font></a>描述；<br /><br /><br />deflate 格式，由<a href="ftp://ds.internic.net/rfc/rfc1951.txt" target="_blank"><font color="#0000f0">ftp://ds.internic.net/rfc/rfc1951.txt</font></a>描述；<br /><br /><br />gzip 格式：由<a href="ftp://ds.internic.net/rfc/rfc1952.txt" target="_blank"><font color="#0000f0">ftp://ds.internic.net/rfc/rfc1952.txt</font></a>描述；<br /><br />C.13 字符界面函数库<br /><br />UNIX 系统对字符界面的支持是非常完善的。在 Linux 系统中，可在如下几个层次<br />上进行字符界面编程：<br /><br />1．利用 ANSI 的标准输入/输出函数，例如 printf，scanf 等。<br /><br />2．利用 termcap 函数库。termcap 函数库实际利用定义在 TERMinal CAPabilitie<br /> （终端能力，/etc/termcap）数据库中的信息获得对如下特殊操作的支持：<br /><br /><br />特殊字符的显示；<br /><br /><br />字符的插入、删除以及行的插入、删除等操作；<br /><br /><br />终端初始化。<br /><br />但是 termcap 函数库只提供了对终端的底层访问，而颜色属性、参数化输出和优化<br />等工作，需要应用程序自己完成。<br /><br />3．使用 terminfo 数据库。TERMinal INFOrmation （终端信息，usr/lib/terminf<br />o/[A-z][0-9]）基于 termcap 数据库，也提供了对终端能力的描述，但较 termcap <br />高级。利用 terminfo 数据库，程序可方便地改变屏幕属性，并使用诸如功能键在内<br />的特殊按键。<br /><br />4．curses 函数库。curses 函数库基于 terminfo 数据库提供了更加高级的终端访<br />问能力。利用 curses 可打开并操作屏幕上的窗口，而且 curses 还提供了完整的输<br />入和输出函数集合，可修改 150 种之多的终端的视频属性。<br /><br />5．ncurses 函数库。ncurses 是对 ncrses 函数库的提高和扩展。它和 SVr4 兼容<br />，并提供了某些扩展，包括颜色操作、输出的特殊优化等等。在 Linux 系统中，ncu<br />rses 是使用最为广泛的字符界面函数库，许多基于字符界面的配置工具，如 netcon<br />f，均是基于 ncurses 的程序。<br /><img src ="http://www.cnitblog.com/guopingleee/aggbug/31703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-13 13:16 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/13/31703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POSIX.1 and ISO C标准头文件（原创</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/13/31701.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Mon, 13 Aug 2007 05:13:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/13/31701.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31701.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/13/31701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31701.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31701.html</trackback:ping><description><![CDATA[
		<div>
				<strong>ISO C标准定义的头文件(24项)</strong>
		</div>
		<div>&lt;assert.h&gt;       ----------------------   验证程序断言</div>
		<div>&lt;complex.h&gt;    ----------------------   支持复数算术运算</div>
		<div>&lt;ctype.h&gt;        ----------------------   字符类型</div>
		<div>&lt;errno.h&gt;        ----------------------   出错码</div>
		<div>&lt;fenv.h&gt;          ----------------------   浮点环境</div>
		<div>&lt;float.h&gt;          ----------------------   浮点常量</div>
		<div>&lt;inttypes.h&gt;    ----------------------   整型格式转换</div>
		<div>&lt;iso646.h&gt;      ----------------------   替代关系操作符宏</div>
		<div>&lt;limits.h&gt;         ----------------------   实现常量</div>
		<div>&lt;locale.h&gt;       ----------------------   局部类别</div>
		<div>&lt;math.h&gt;         ----------------------   数学常量</div>
		<div>&lt;setjmp.h&gt;      ----------------------   非局部goto</div>
		<div>&lt;signal.h&gt;       ----------------------   信号</div>
		<div>&lt;stdarg.h&gt;      ----------------------   可变参数表</div>
		<div>&lt;stdbool.h&gt;     ----------------------   布尔类型和值</div>
		<div>&lt;stddef.h&gt;       ----------------------   标准定义</div>
		<div>&lt;stdint.h&gt;        ----------------------   整型</div>
		<div>&lt;stdio.h&gt;         ----------------------   标准I/O库</div>
		<div>&lt;stdlib.h&gt;        ----------------------   实用程序库函数</div>
		<div>&lt;string.h&gt;       ----------------------   字符串操作</div>
		<div>&lt;tgmath.h&gt;     ----------------------   通用类型数学宏</div>
		<div>&lt;time.h&gt;         ----------------------   时间和日期</div>
		<div>&lt;wchar.h&gt;      ----------------------   扩展的多字节和宽字符支持</div>
		<div>&lt;wctype.h&gt;     ----------------------   宽字符分类和映射支持</div>
		<div> </div>
		<div>
				<strong>POSIX标准定义的必须的头文件(26项)</strong>
		</div>
		<div>&lt;dirent.h&gt;      ----------------------   目录项</div>
		<div>&lt;fcntl.h&gt;         ----------------------   文件控制</div>
		<div>&lt;fnmatch.h&gt;   ----------------------   文件名匹配类型</div>
		<div>&lt;glob.h&gt;         ----------------------   路径名模式匹配类型</div>
		<div>&lt;grp.h&gt;          ----------------------   组文件</div>
		<div>&lt;netdb.h&gt;      ----------------------   网络数据库操作</div>
		<div>&lt;pwd.h&gt;         ----------------------   口令文件</div>
		<div>&lt;regex.h&gt;      ----------------------   正则表达式</div>
		<div>&lt;tar.h&gt;           ----------------------   tar归档值</div>
		<div>&lt;termios.h&gt;    ----------------------   终端I/O</div>
		<div>&lt;unistd.h&gt;      ----------------------   符号常量</div>
		<div>&lt;utime.h&gt;       ----------------------   文件时间</div>
		<div>&lt;wordexp.h&gt;   ----------------------   字扩展类型</div>
		<div>&lt;arpa/inet.h&gt;  ----------------------   Internet定义</div>
		<div>&lt;net/if..h&gt;       ----------------------   套接字本地接口</div>
		<div>&lt;netinet/in.h&gt; ----------------------   Internet地址族</div>
		<div>&lt;netinet/tcp.h&gt;----------------------   传输控制协议定义</div>
		<div>&lt;sys/mman.h&gt;----------------------   内存管理声明</div>
		<div>&lt;sys/select.h&gt;----------------------   select函数</div>
		<div>&lt;sys/socket.h&gt;----------------------   套接字接口</div>
		<div>&lt;sys/stat.h&gt;    ----------------------   文件状态</div>
		<div>&lt;sys/times.h&gt;  ----------------------   进程时间</div>
		<div>&lt;sys/types.h&gt;  ----------------------   基本系统数据类型</div>
		<div>&lt;sys/un.h&gt;      ----------------------   UNIX域套接字定义</div>
		<div>&lt;sys/utsname.h&gt;----------------------系统名</div>
		<div>&lt;sys/wait.h&gt;    ----------------------   进程控制</div>
		<div> </div>
		<div>
				<strong>POSIX标准定义的XSI扩展头文件(26项)</strong>
		</div>
		<div>&lt;cpio.h&gt;          ----------------------   cpio归档值</div>
		<div>&lt;dlfcn.h&gt;         ----------------------   动态链接</div>
		<div>&lt;fmtmsg.h&gt;     ----------------------   消息显示结构</div>
		<div>&lt;ftw.h&gt;            ----------------------   文件树漫游</div>
		<div>&lt;iconv.h&gt;        ----------------------   代码集转换实用程序</div>
		<div>&lt;langinfo.h&gt;    ----------------------   语言信息常量</div>
		<div>&lt;libgen.h&gt;       ----------------------   模式匹配函数定义</div>
		<div>&lt;monetary.h&gt;  ----------------------   货币类型</div>
		<div>&lt;ndbm.h&gt;        ----------------------   数据库操作</div>
		<div>&lt;nl_types.h&gt;   ----------------------   消息类别</div>
		<div>&lt;poll.h&gt;           ----------------------   轮询函数</div>
		<div>&lt;search.h&gt;      ----------------------   搜索表</div>
		<div>&lt;strings.h&gt;      ----------------------   字符串操作</div>
		<div>&lt;syslog.h&gt;      ----------------------   系统出错日志记录</div>
		<div>&lt;ucontext.h&gt;   ----------------------   用户上下文</div>
		<div>&lt;ulimit.h&gt;        ----------------------   用户限制</div>
		<div>&lt;utmpx.h&gt;       ----------------------   用户帐户数据库</div>
		<div>&lt;sys/ipc.h&gt;      ----------------------   IPC</div>
		<div>&lt;sys/msg.h&gt;    ----------------------   消息队列</div>
		<div>&lt;sys/resource.h&gt;-------------------   资源操作</div>
		<div>&lt;sys/sem.h&gt;    ----------------------   信号量</div>
		<div>&lt;sys/shm.h&gt;    ----------------------   共享存储</div>
		<div>&lt;sys/statvfs.h&gt;----------------------   文件系统信息</div>
		<div>&lt;sys/time.h&gt;    ----------------------   时间类型</div>
		<div>&lt;sys/timeb.h&gt;  ----------------------   附加的日期和时间定义</div>
		<div>&lt;sys/uio.h&gt;      ----------------------   矢量I/O操作</div>
		<div> </div>
		<div>
				<strong>POSIX标准定义的可选头文件(8项)</strong>
				<div>&lt;aio.h&gt;            ----------------------   异步I/O</div>
				<div>&lt;mqueue.h&gt;    ----------------------   消息队列</div>
				<div>&lt;pthread.h&gt;    ----------------------   线程</div>
				<div>&lt;sched.h&gt;       ----------------------   执行调度</div>
				<div>&lt;semaphore.h&gt;---------------------   信号量</div>
				<div>&lt;spawn.h&gt;       ----------------------   实时spawn接口</div>
				<div>&lt;stropts.h&gt;      ----------------------   XSI STREAMS接口</div>
				<div>&lt;trace.h&gt;         ----------------------   时间跟踪</div>
		</div>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/31701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-13 13:13 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/13/31701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux系统调用列表</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Wed, 08 Aug 2007 01:49:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31477.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31477.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31477.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1>Linux系统调用列表</h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<!-- this content will be automatically generated across all content areas -->
																		<br />
																		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
										<p>
												<br />本文列出了大部分常见的Linux系统调用，并附有简要中文说明。</p>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>以下是Linux系统调用的一个列表，包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表，即使是简单的字母序英文列表，能做到这么完全也是很罕见的。</p>
										<p>按照惯例，这个列表以man pages第2节，即系统调用节为蓝本。按照笔者的理解，对其作了大致的分类，同时也作了一些小小的修改，删去了几个仅供内核使用，不允许用户调用的系统调用，对个别本人稍觉不妥的地方作了一些小的修改，并对所有列出的系统调用附上简要注释。</p>
										<p>其中有一些函数的作用完全相同，只是参数不同。（可能很多熟悉C++朋友马上就能联想起函数重载，但是别忘了Linux核心是用C语言写的，所以只能取成不同的函数名）。还有一些函数已经过时，被新的更好的函数所代替了（gcc在链接这些函数时会发出警告），但因为兼容的原因还保留着，这些函数我会在前面标上“*”号以示区别。</p>
										<p>
												<a name="1">
														<span class="atitle">一、进程控制：</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="550" border="1">
												<tbody>
														<tr>
																<td width="30">fork</td>
																<td>创建一个新进程</td>
														</tr>
														<tr>
																<td>clone</td>
																<td>按指定条件创建子进程</td>
														</tr>
														<tr>
																<td>execve</td>
																<td>运行可执行文件</td>
														</tr>
														<tr>
																<td>exit</td>
																<td>中止进程</td>
														</tr>
														<tr>
																<td>_exit</td>
																<td>立即中止当前进程</td>
														</tr>
														<tr>
																<td>getdtablesize</td>
																<td>进程所能打开的最大文件数</td>
														</tr>
														<tr>
																<td>getpgid</td>
																<td>获取指定进程组标识号</td>
														</tr>
														<tr>
																<td>setpgid</td>
																<td>设置指定进程组标志号</td>
														</tr>
														<tr>
																<td>getpgrp</td>
																<td>获取当前进程组标识号</td>
														</tr>
														<tr>
																<td>setpgrp</td>
																<td>设置当前进程组标志号</td>
														</tr>
														<tr>
																<td>getpid</td>
																<td>获取进程标识号</td>
														</tr>
														<tr>
																<td>getppid</td>
																<td>获取父进程标识号</td>
														</tr>
														<tr>
																<td>getpriority</td>
																<td>获取调度优先级</td>
														</tr>
														<tr>
																<td>setpriority</td>
																<td>设置调度优先级</td>
														</tr>
														<tr>
																<td>modify_ldt</td>
																<td>读写进程的本地描述表</td>
														</tr>
														<tr>
																<td>nanosleep</td>
																<td>使进程睡眠指定的时间</td>
														</tr>
														<tr>
																<td>nice</td>
																<td>改变分时进程的优先级</td>
														</tr>
														<tr>
																<td>pause</td>
																<td>挂起进程，等待信号</td>
														</tr>
														<tr>
																<td>personality</td>
																<td>设置进程运行域</td>
														</tr>
														<tr>
																<td>prctl</td>
																<td>对进程进行特定操作</td>
														</tr>
														<tr>
																<td>ptrace</td>
																<td>进程跟踪</td>
														</tr>
														<tr>
																<td>sched_get_priority_max</td>
																<td>取得静态优先级的上限</td>
														</tr>
														<tr>
																<td>sched_get_priority_min</td>
																<td>取得静态优先级的下限</td>
														</tr>
														<tr>
																<td>sched_getparam</td>
																<td>取得进程的调度参数</td>
														</tr>
														<tr>
																<td>sched_getscheduler</td>
																<td>取得指定进程的调度策略</td>
														</tr>
														<tr>
																<td>sched_rr_get_interval</td>
																<td>取得按RR算法调度的实时进程的时间片长度</td>
														</tr>
														<tr>
																<td>sched_setparam</td>
																<td>设置进程的调度参数</td>
														</tr>
														<tr>
																<td>sched_setscheduler</td>
																<td>设置指定进程的调度策略和参数</td>
														</tr>
														<tr>
																<td>sched_yield</td>
																<td>进程主动让出处理器,并将自己等候调度队列队尾</td>
														</tr>
														<tr>
																<td>vfork</td>
																<td>创建一个子进程，以供执行新程序，常与execve等同时使用</td>
														</tr>
														<tr>
																<td>wait</td>
																<td>等待子进程终止</td>
														</tr>
														<tr>
																<td>wait3</td>
																<td>参见wait</td>
														</tr>
														<tr>
																<td>waitpid</td>
																<td>等待指定子进程终止</td>
														</tr>
														<tr>
																<td>wait4</td>
																<td>参见waitpid</td>
														</tr>
														<tr>
																<td>capget</td>
																<td>获取进程权限</td>
														</tr>
														<tr>
																<td>capset</td>
																<td>设置进程权限</td>
														</tr>
														<tr>
																<td>getsid</td>
																<td>获取会晤标识号</td>
														</tr>
														<tr>
																<td>setsid</td>
																<td>设置会晤标识号</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="2">
														<span class="atitle">二、文件系统控制</span>
												</a>
										</p>
										<p>
												<a name="N101B3">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">1、文件读写操作</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">fcntl</td>
																<td>文件控制</td>
														</tr>
														<tr>
																<td>open</td>
																<td>打开文件</td>
														</tr>
														<tr>
																<td>creat</td>
																<td>创建新文件</td>
														</tr>
														<tr>
																<td>close</td>
																<td>关闭文件描述字</td>
														</tr>
														<tr>
																<td>read</td>
																<td>读文件</td>
														</tr>
														<tr>
																<td>write</td>
																<td>写文件</td>
														</tr>
														<tr>
																<td>readv</td>
																<td>从文件读入数据到缓冲数组中</td>
														</tr>
														<tr>
																<td>writev</td>
																<td>将缓冲数组里的数据写入文件</td>
														</tr>
														<tr>
																<td>pread</td>
																<td>对文件随机读</td>
														</tr>
														<tr>
																<td>pwrite</td>
																<td>对文件随机写</td>
														</tr>
														<tr>
																<td>lseek</td>
																<td>移动文件指针</td>
														</tr>
														<tr>
																<td>_llseek</td>
																<td>在64位地址空间里移动文件指针</td>
														</tr>
														<tr>
																<td>dup</td>
																<td>复制已打开的文件描述字</td>
														</tr>
														<tr>
																<td>dup2</td>
																<td>按指定条件复制文件描述字</td>
														</tr>
														<tr>
																<td>flock</td>
																<td>文件加/解锁</td>
														</tr>
														<tr>
																<td>poll</td>
																<td>I/O多路转换</td>
														</tr>
														<tr>
																<td>truncate</td>
																<td>截断文件</td>
														</tr>
														<tr>
																<td>ftruncate</td>
																<td>参见truncate</td>
														</tr>
														<tr>
																<td>umask</td>
																<td>设置文件权限掩码</td>
														</tr>
														<tr>
																<td>fsync</td>
																<td>把文件在内存中的部分写回磁盘</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10279">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">2、文件系统操作</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">access</td>
																<td>确定文件的可存取性</td>
														</tr>
														<tr>
																<td>chdir</td>
																<td>改变当前工作目录</td>
														</tr>
														<tr>
																<td>fchdir</td>
																<td>参见chdir</td>
														</tr>
														<tr>
																<td>chmod</td>
																<td>改变文件方式</td>
														</tr>
														<tr>
																<td>fchmod</td>
																<td>参见chmod</td>
														</tr>
														<tr>
																<td>chown</td>
																<td>改变文件的属主或用户组</td>
														</tr>
														<tr>
																<td>fchown</td>
																<td>参见chown</td>
														</tr>
														<tr>
																<td>lchown</td>
																<td>参见chown</td>
														</tr>
														<tr>
																<td>chroot</td>
																<td>改变根目录</td>
														</tr>
														<tr>
																<td>stat</td>
																<td>取文件状态信息</td>
														</tr>
														<tr>
																<td>lstat</td>
																<td>参见stat</td>
														</tr>
														<tr>
																<td>fstat</td>
																<td>参见stat</td>
														</tr>
														<tr>
																<td>statfs</td>
																<td>取文件系统信息</td>
														</tr>
														<tr>
																<td>fstatfs</td>
																<td>参见statfs</td>
														</tr>
														<tr>
																<td>readdir</td>
																<td>读取目录项</td>
														</tr>
														<tr>
																<td>getdents</td>
																<td>读取目录项</td>
														</tr>
														<tr>
																<td>mkdir</td>
																<td>创建目录</td>
														</tr>
														<tr>
																<td>mknod</td>
																<td>创建索引节点</td>
														</tr>
														<tr>
																<td>rmdir</td>
																<td>删除目录</td>
														</tr>
														<tr>
																<td>rename</td>
																<td>文件改名</td>
														</tr>
														<tr>
																<td>link</td>
																<td>创建链接</td>
														</tr>
														<tr>
																<td>symlink</td>
																<td>创建符号链接</td>
														</tr>
														<tr>
																<td>unlink</td>
																<td>删除链接</td>
														</tr>
														<tr>
																<td>readlink</td>
																<td>读符号链接的值</td>
														</tr>
														<tr>
																<td>mount</td>
																<td>安装文件系统</td>
														</tr>
														<tr>
																<td>umount</td>
																<td>卸下文件系统</td>
														</tr>
														<tr>
																<td>ustat</td>
																<td>取文件系统信息</td>
														</tr>
														<tr>
																<td>utime</td>
																<td>改变文件的访问修改时间</td>
														</tr>
														<tr>
																<td>utimes</td>
																<td>参见utime</td>
														</tr>
														<tr>
																<td>quotactl</td>
																<td>控制磁盘配额</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="3">
														<span class="atitle">三、系统控制</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">ioctl</td>
																<td>I/O总控制函数</td>
														</tr>
														<tr>
																<td>_sysctl</td>
																<td>读/写系统参数</td>
														</tr>
														<tr>
																<td>acct</td>
																<td>启用或禁止进程记账</td>
														</tr>
														<tr>
																<td>getrlimit</td>
																<td>获取系统资源上限</td>
														</tr>
														<tr>
																<td>setrlimit</td>
																<td>设置系统资源上限</td>
														</tr>
														<tr>
																<td>getrusage</td>
																<td>获取系统资源使用情况</td>
														</tr>
														<tr>
																<td>uselib</td>
																<td>选择要使用的二进制函数库</td>
														</tr>
														<tr>
																<td>ioperm</td>
																<td>设置端口I/O权限</td>
														</tr>
														<tr>
																<td>iopl</td>
																<td>改变进程I/O权限级别</td>
														</tr>
														<tr>
																<td>outb</td>
																<td>低级端口操作</td>
														</tr>
														<tr>
																<td>reboot</td>
																<td>重新启动</td>
														</tr>
														<tr>
																<td>swapon</td>
																<td>打开交换文件和设备</td>
														</tr>
														<tr>
																<td>swapoff</td>
																<td>关闭交换文件和设备</td>
														</tr>
														<tr>
																<td>bdflush</td>
																<td>控制bdflush守护进程</td>
														</tr>
														<tr>
																<td>sysfs</td>
																<td>取核心支持的文件系统类型</td>
														</tr>
														<tr>
																<td>sysinfo</td>
																<td>取得系统信息</td>
														</tr>
														<tr>
																<td>adjtimex</td>
																<td>调整系统时钟</td>
														</tr>
														<tr>
																<td>alarm</td>
																<td>设置进程的闹钟</td>
														</tr>
														<tr>
																<td>getitimer</td>
																<td>获取计时器值</td>
														</tr>
														<tr>
																<td>setitimer</td>
																<td>设置计时器值</td>
														</tr>
														<tr>
																<td>gettimeofday</td>
																<td>取时间和时区</td>
														</tr>
														<tr>
																<td>settimeofday</td>
																<td>设置时间和时区</td>
														</tr>
														<tr>
																<td>stime</td>
																<td>设置系统日期和时间</td>
														</tr>
														<tr>
																<td>time</td>
																<td>取得系统时间</td>
														</tr>
														<tr>
																<td>times</td>
																<td>取进程运行时间</td>
														</tr>
														<tr>
																<td>uname</td>
																<td>获取当前UNIX系统的名称、版本和主机等信息</td>
														</tr>
														<tr>
																<td>vhangup</td>
																<td>挂起当前终端</td>
														</tr>
														<tr>
																<td>nfsservctl</td>
																<td>对NFS守护进程进行控制</td>
														</tr>
														<tr>
																<td>vm86</td>
																<td>进入模拟8086模式</td>
														</tr>
														<tr>
																<td>create_module</td>
																<td>创建可装载的模块项</td>
														</tr>
														<tr>
																<td>delete_module</td>
																<td>删除可装载的模块项</td>
														</tr>
														<tr>
																<td>init_module</td>
																<td>初始化模块</td>
														</tr>
														<tr>
																<td>query_module</td>
																<td>查询模块信息</td>
														</tr>
														<tr>
																<td>*get_kernel_syms</td>
																<td>取得核心符号,已被query_module代替</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="4">
														<span class="atitle">四、内存管理</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">brk</td>
																<td>改变数据段空间的分配</td>
														</tr>
														<tr>
																<td>sbrk</td>
																<td>参见brk</td>
														</tr>
														<tr>
																<td>mlock</td>
																<td>内存页面加锁</td>
														</tr>
														<tr>
																<td>munlock</td>
																<td>内存页面解锁</td>
														</tr>
														<tr>
																<td>mlockall</td>
																<td>调用进程所有内存页面加锁</td>
														</tr>
														<tr>
																<td>munlockall</td>
																<td>调用进程所有内存页面解锁</td>
														</tr>
														<tr>
																<td>mmap</td>
																<td>映射虚拟内存页</td>
														</tr>
														<tr>
																<td>munmap</td>
																<td>去除内存页映射</td>
														</tr>
														<tr>
																<td>mremap</td>
																<td>重新映射虚拟内存地址</td>
														</tr>
														<tr>
																<td>msync</td>
																<td>将映射内存中的数据写回磁盘</td>
														</tr>
														<tr>
																<td>mprotect</td>
																<td>设置内存映像保护</td>
														</tr>
														<tr>
																<td>getpagesize</td>
																<td>获取页面大小</td>
														</tr>
														<tr>
																<td>sync</td>
																<td>将内存缓冲区数据写回硬盘</td>
														</tr>
														<tr>
																<td>cacheflush</td>
																<td>将指定缓冲区中的内容写回磁盘</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="5">
														<span class="atitle">五、网络管理</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">getdomainname</td>
																<td>取域名</td>
														</tr>
														<tr>
																<td>setdomainname</td>
																<td>设置域名</td>
														</tr>
														<tr>
																<td>gethostid</td>
																<td>获取主机标识号</td>
														</tr>
														<tr>
																<td>sethostid</td>
																<td>设置主机标识号</td>
														</tr>
														<tr>
																<td>gethostname</td>
																<td>获取本主机名称</td>
														</tr>
														<tr>
																<td>sethostname</td>
																<td>设置主机名称</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="6">
														<span class="atitle">六、socket控制</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">socketcall</td>
																<td>socket系统调用</td>
														</tr>
														<tr>
																<td>socket</td>
																<td>建立socket</td>
														</tr>
														<tr>
																<td>bind</td>
																<td>绑定socket到端口</td>
														</tr>
														<tr>
																<td>connect</td>
																<td>连接远程主机</td>
														</tr>
														<tr>
																<td>accept</td>
																<td>响应socket连接请求</td>
														</tr>
														<tr>
																<td>send</td>
																<td>通过socket发送信息</td>
														</tr>
														<tr>
																<td>sendto</td>
																<td>发送UDP信息</td>
														</tr>
														<tr>
																<td>sendmsg</td>
																<td>参见send</td>
														</tr>
														<tr>
																<td>recv</td>
																<td>通过socket接收信息</td>
														</tr>
														<tr>
																<td>recvfrom</td>
																<td>接收UDP信息</td>
														</tr>
														<tr>
																<td>recvmsg</td>
																<td>参见recv</td>
														</tr>
														<tr>
																<td>listen</td>
																<td>监听socket端口</td>
														</tr>
														<tr>
																<td>select</td>
																<td>对多路同步I/O进行轮询</td>
														</tr>
														<tr>
																<td>shutdown</td>
																<td>关闭socket上的连接</td>
														</tr>
														<tr>
																<td>getsockname</td>
																<td>取得本地socket名字</td>
														</tr>
														<tr>
																<td>getpeername</td>
																<td>获取通信对方的socket名字</td>
														</tr>
														<tr>
																<td>getsockopt</td>
																<td>取端口设置</td>
														</tr>
														<tr>
																<td>setsockopt</td>
																<td>设置端口参数</td>
														</tr>
														<tr>
																<td>sendfile</td>
																<td>在文件或端口间传输数据</td>
														</tr>
														<tr>
																<td>socketpair</td>
																<td>创建一对已联接的无名socket</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="7">
														<span class="atitle">七、用户管理</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">getuid</td>
																<td>获取用户标识号</td>
														</tr>
														<tr>
																<td>setuid</td>
																<td>设置用户标志号</td>
														</tr>
														<tr>
																<td>getgid</td>
																<td>获取组标识号</td>
														</tr>
														<tr>
																<td>setgid</td>
																<td>设置组标志号</td>
														</tr>
														<tr>
																<td>getegid</td>
																<td>获取有效组标识号</td>
														</tr>
														<tr>
																<td>setegid</td>
																<td>设置有效组标识号</td>
														</tr>
														<tr>
																<td>geteuid</td>
																<td>获取有效用户标识号</td>
														</tr>
														<tr>
																<td>seteuid</td>
																<td>设置有效用户标识号</td>
														</tr>
														<tr>
																<td>setregid</td>
																<td>分别设置真实和有效的的组标识号</td>
														</tr>
														<tr>
																<td>setreuid</td>
																<td>分别设置真实和有效的用户标识号</td>
														</tr>
														<tr>
																<td>getresgid</td>
																<td>分别获取真实的,有效的和保存过的组标识号</td>
														</tr>
														<tr>
																<td>setresgid</td>
																<td>分别设置真实的,有效的和保存过的组标识号</td>
														</tr>
														<tr>
																<td>getresuid</td>
																<td>分别获取真实的,有效的和保存过的用户标识号</td>
														</tr>
														<tr>
																<td>setresuid</td>
																<td>分别设置真实的,有效的和保存过的用户标识号</td>
														</tr>
														<tr>
																<td>setfsgid</td>
																<td>设置文件系统检查时使用的组标识号</td>
														</tr>
														<tr>
																<td>setfsuid</td>
																<td>设置文件系统检查时使用的用户标识号</td>
														</tr>
														<tr>
																<td>getgroups</td>
																<td>获取后补组标志清单</td>
														</tr>
														<tr>
																<td>setgroups</td>
																<td>设置后补组标志清单</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="8">
														<span class="atitle">八、进程间通信</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">ipc</td>
																<td>进程间通信总控制调用</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N1074A">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">1、信号</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">sigaction</td>
																<td>设置对指定信号的处理方法</td>
														</tr>
														<tr>
																<td>sigprocmask</td>
																<td>根据参数对信号集中的信号执行阻塞/解除阻塞等操作</td>
														</tr>
														<tr>
																<td>sigpending</td>
																<td>为指定的被阻塞信号设置队列</td>
														</tr>
														<tr>
																<td>sigsuspend</td>
																<td>挂起进程等待特定信号</td>
														</tr>
														<tr>
																<td>signal</td>
																<td>参见signal</td>
														</tr>
														<tr>
																<td>kill</td>
																<td>向进程或进程组发信号</td>
														</tr>
														<tr>
																<td>*sigblock</td>
																<td>向被阻塞信号掩码中添加信号,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*siggetmask</td>
																<td>取得现有阻塞信号掩码,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*sigsetmask</td>
																<td>用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*sigmask</td>
																<td>将给定的信号转化为掩码,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*sigpause</td>
																<td>作用同sigsuspend,已被sigsuspend代替</td>
														</tr>
														<tr>
																<td>sigvec</td>
																<td>为兼容BSD而设的信号处理函数,作用类似sigaction</td>
														</tr>
														<tr>
																<td>ssetmask</td>
																<td>ANSI C的信号处理函数,作用类似sigaction</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N107D1">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">2、消息</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">msgctl</td>
																<td>消息控制操作</td>
														</tr>
														<tr>
																<td>msgget</td>
																<td>获取消息队列</td>
														</tr>
														<tr>
																<td>msgsnd</td>
																<td>发消息</td>
														</tr>
														<tr>
																<td>msgrcv</td>
																<td>取消息</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10807">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">3、管道</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">pipe</td>
																<td>创建管道</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10822">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">4、信号量</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">semctl</td>
																<td>信号量控制</td>
														</tr>
														<tr>
																<td>semget</td>
																<td>获取一组信号量</td>
														</tr>
														<tr>
																<td>semop</td>
																<td>信号量操作</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N1084F">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">5、共享内存</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">shmctl</td>
																<td>控制共享内存</td>
														</tr>
														<tr>
																<td>shmget</td>
																<td>获取共享内存</td>
														</tr>
														<tr>
																<td>shmat</td>
																<td>连接共享内存</td>
														</tr>
														<tr>
																<td>shmdt</td>
																<td>拆卸共享内存</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="resources">
														<span class="atitle">参考资料 </span>
												</a>
												<br />
												<br />
												<a href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html">http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html</a>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/31477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-08 09:49 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux如何处理当前运行环境的环境变量</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Tue, 07 Aug 2007 13:55:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31468.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31468.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31468.html</trackback:ping><description><![CDATA[
		<div id="contitle">
				<h1>Linux如何处理当前运行环境的环境变量</h1>
				<p>
						<br /> </p>
		</div>
		<div id="conauthor">
				<span>2006-10-19 00:00 </span>
				<span>作者： </span>
				<span>出处： 天极博客 </span>
				<span>责任编辑：<a title="向本编辑提问" href="http://comments.yesky.com/t/%D4%AD%D2%B0/6,324/2623818.shtml" target="_blank">原野</a></span>
		</div>
		<div class="topadbg">
				<span id="ad9">
						<div id="ad9ad">
						</div>
				</span>
		</div>
		<div id="conneirong">
				<span id="ad3">
				</span>
				<div class="guanggao">
						<span id="contentAdv">
								<br />
						</span>
				</div>
				<p>
						<br />
						<strong>
								<font color="#ff0000">setenv(set environment variable)<br /></font>
						</strong>
						<br />
						<strong>功能说明：</strong>查询或显示环境变量。<br /><br /><b>语　　法：</b>setenv [变量名称][变量值<br /><br />　　GNU/Linux下面每个程序运行都有一个所谓的运行环境，这里的环境实际上就是一组变量的定义。所有的变量和他们的值都是字符串形式表达的。通过转换，通常变量名字都是用大写字符表达。 </p>
				<p>　　对于环境变量大家都不陌生，例如，我们都很熟悉的HOME这个环境变量，这个变量指示的当前用户的个人用户目录的路径。又例如，PATH这个环境变量，它指示出当前Linux系统搜索的的执行文件的路径列表。 </p>
				<p>　　对于我们在Linux下常用的BASH这个shell程序，它有自己的一套管理环境变量的方法。例如，通过$NAME来访问相应的环境变量，通过export来设置环境变量，下面是一个实例： <br /></p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>[hwang@langchao linuxprogram]$ echo $HOME 
　　/home/hwang 
　　[hwang@langchao linuxprogram]$ export MYNAME="Luster" 
　　[hwang@langchao linuxprogram]$ echo $MYNAME 
　　Luster 
　　[hwang@langchao linuxprogram]$</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
				<p>　　而在我们的应用程序里面，如果需要访问一个环境变量，我们可以通过getenv（）这个函数来实现，getenv这个函数在这个头文件中声明。这个函数的输入参数是需要访问的变量名字，得到的返回值是一个字符串，如果所访问的环境变量没有设置，则会返回NULL。如果需要在程序里面设置某个环境变量，则可以使用setenv这个函数，如果是要清除某个特定的环境变量，则使用unsetenv这个函数。它们的函数原型如下： <br /></p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>#include  
　　 char *getenv(const char *name); 
　　 int setenv(const char *name, const char *value, int overwrite); 
　　 void unsetenv(const char *name);</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
				<p>　　值得一提的是，GNU C函数库里面有一个特殊的全局的变量，名字叫做environ，这个变量的类型是char **，它所指向的是所有的环境变量的一个列表，最后是以NULL结尾。每个字符串都是“VALUE=value”这样的形式。例如下面的程序可以打印出当前运行环境里面的所有的环境变量： <br /><br /></p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>#include  
　　extern char**environ; 
　　int main () 
　　{ 
　　 char**var; 
　　 for (var =environ;*var !=NULL;++var) 
　　 printf (“%s  
　　 “,*var); 
　　 return 0; 
　　} 
　　</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
				<p>　　注意，如果你需要修改某个环境变量，不要直接修改environ这个变量，而应该使用setenv或者unsetenv这样的管理函数来做这件事情。 </p>
				<p>　　一般来说，当一个程序启动的时候，它就会拷贝一份启动它的“父”程序所拥有的环境变量。环境变量是GNU程序常用来配置某个应用程序的行为的一个方法，例如，通过环境变量来设置HTTP代理服务器的地址和端口号等等。下面是一段代码的演示： </p>
				<p>　　 </p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>　#include  
　　#include  
　　int main () 
　　{ 
　　 char *server_name =getenv (“SERVER_NAME ”); 
　　 if (server_name ==NULL) 
　　 server_name =“server.my-company.com ”; 
　　 printf (“accessing server %s  
　　 ”,server_name); 
　　 
　　 return 0; 
　　} 
</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
		</div>
		<br />源地址:<br /><a href="http://os.yesky.com/lin/318/2623818.shtml">http://os.yesky.com/lin/318/2623818.shtml</a><br /><br /><br />=============================================================================================<br /><br /><br /><strong>linux c 环境控制篇</strong><br /><br /><table width="100%"><tbody><tr><td><font face="宋体" size="2">getenv（取得环境变量内容） </font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">相关函数 </font></div></td><td><font face="宋体" size="2">putenv，setenv，unsetenv<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">表头文件 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">定义函数 </font></div></td><td><font face="宋体" size="2">char * getenv(const char *name);<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">函数说明 </font></div></td><td><font face="宋体" size="2">getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称，如果该变量存在则会返回指向该内容的指针。环境变量的格式为name＝value。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">返回值 </font></div></td><td><font face="宋体" size="2">执行成功则返回指向该内容的指针，找不到符合的环境变量名称则返回NULL。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">范例 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br />mian()<br />{<br />char *p;<br />if((p = getenv(“USER”)))<br />printf(“USER=%sn”,p);<br />}<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">执行 </font></div></td><td><font face="宋体" size="2">USER = root<br /></font></td></tr><tr><td valign="top" width="80">　 
<div align="right"><br /><font face="宋体" size="2"><a name="linuxc290"></a></font></div></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2"><br /></font></div></td><td><font face="宋体" size="2"><br />putenv（改变或增加环境变量） </font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">相关函数 </font></div></td><td><font face="宋体" size="2">getenv，setenv，unsetenv<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">表头文件 </font></div></td><td><font face="宋体" size="2">#include4&lt;stdlib.h&gt;<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">定义函数 </font></div></td><td><font face="宋体" size="2">int putenv(const char * string);<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">函数说明 </font></div></td><td><font face="宋体" size="2">putenv()用来改变或增加环境变量的内容。参数string的格式为name＝value，如果该环境变量原先存在，则变量内容会依参数string改变，否则此参数内容会成为新的环境变量。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">返回值 </font></div></td><td><font face="宋体" size="2">执行成功则返回0，有错误发生则返回-1。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">错误代码 </font></div></td><td><font face="宋体" size="2">ENOMEM 内存不足，无法配置新的环境变量空间。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">范例 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br />main()<br />{<br />char *p;<br />if((p = getenv(“USER”)))<br />printf(“USER =%sn”,p);<br />putenv(“USER=test”);<br />printf(“USER+5sn”,getenv(“USER”));<br />}<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">执行 </font></div></td><td><font face="宋体" size="2">USER=root<br />USER=root<br /></font></td></tr><tr><td valign="top" width="80">　 
<div align="right"><br /><font face="宋体" size="2"><a name="linuxc291"></a></font></div></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2"><br /></font></div></td><td><font face="宋体" size="2"><br />setenv（改变或增加环境变量） </font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">相关函数 </font></div></td><td><font face="宋体" size="2">getenv，putenv，unsetenv<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">表头文件 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">定义函数 </font></div></td><td><font face="宋体" size="2">int setenv(const char *name,const char * value,int overwrite);<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">函数说明 </font></div></td><td><font face="宋体" size="2">setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">参数 </font></div></td><td><font face="宋体" size="2">value则为变量内容，参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0，而该环境变量原已有内容，则原内容会被改为参数value所指的变量内容。如果overwrite为0，且该环境变量已有内容，则参数value会被忽略。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">返回值 </font></div></td><td><font face="宋体" size="2">执行成功则返回0，有错误发生时返回-1。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">错误代码 </font></div></td><td><font face="宋体" size="2">ENOMEM 内存不足，无法配置新的环境变量空间<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">范例 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br />main()<br />{<br />char * p;<br />if((p=getenv(“USER”)))<br />printf(“USER =%sn”,p);<br />setenv(“USER”,”test”,1);<br />printf(“USER=%sn”,getenv(“USEr”));<br />unsetenv(“USER”);<br />printf(“USER=%sn”,getenv(“USER”));<br />}<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">执行 </font></div></td><td><font face="宋体" size="2">USER = root<br />USER = test<br />USER = (null)<br /></font></td></tr></tbody></table><img src ="http://www.cnitblog.com/guopingleee/aggbug/31468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-07 21:55 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Posix线程编程指南(1)</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31369.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Tue, 07 Aug 2007 02:52:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31369.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31369.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31369.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31369.html</trackback:ping><description><![CDATA[
		<blockquote>这是一个关于Posix线程编程的专栏。作者在阐明概念的基础上，将向您详细讲述Posix线程库API。本文是第三篇将向您讲述线程同步。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="1">
						<span class="atitle">互斥锁</span>
				</a>
		</p>
		<p>尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能，但显然semphore的功能过于强大了，在Posix Thread中定义了另外一套专门用于线程同步的mutex函数。</p>
		<p>
				<a name="N1004C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1． 创建和销毁</font>
								</strong>
						</span>
				</a>
		</p>
		<p>有两种方法创建互斥锁，静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁，方法如下： pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads实现中，pthread_mutex_t是一个结构，而PTHREAD_MUTEX_INITIALIZER则是一个结构常量。</p>
		<p>动态方式是采用pthread_mutex_init()函数来初始化互斥锁，API定义如下： int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 其中mutexattr用于指定互斥锁属性（见下），如果为NULL则使用缺省属性。</p>
		<p>pthread_mutex_destroy()用于注销一个互斥锁，API定义如下： int pthread_mutex_destroy(pthread_mutex_t *mutex) 销毁一个互斥锁即意味着释放它所占用的资源，且要求锁当前处于开放状态。由于在Linux中，互斥锁并不占用任何资源，因此LinuxThreads中的pthread_mutex_destroy()除了检查锁状态以外（锁定状态则返回EBUSY）没有其他动作。</p>
		<p>
				<a name="N1005B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2． 互斥锁属性</font>
								</strong>
						</span>
				</a>
		</p>
		<p>互斥锁的属性在创建锁的时候指定，在LinuxThreads实现中仅有一个锁类型属性，不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前（glibc2.2.3,linuxthreads0.9）有四个值可供选择：</p>
		<ul>
				<li>PTHREAD_MUTEX_TIMED_NP，这是缺省值，也就是普通锁。当一个线程加锁以后，其余请求锁的线程将形成一个等待队列，并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。 
</li>
				<li>PTHREAD_MUTEX_RECURSIVE_NP，嵌套锁，允许同一个线程对同一个锁成功获得多次，并通过多次unlock解锁。如果是不同线程请求，则在加锁线程解锁时重新竞争。 
</li>
				<li>PTHREAD_MUTEX_ERRORCHECK_NP，检错锁，如果同一个线程请求同一个锁，则返回EDEADLK，否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。 
</li>
				<li>PTHREAD_MUTEX_ADAPTIVE_NP，适应锁，动作最简单的锁类型，仅等待解锁后重新竞争。 </li>
		</ul>
		<p>
				<a name="N10073">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3． 锁操作</font>
								</strong>
						</span>
				</a>
		</p>
		<p>锁操作主要包括加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁pthread_mutex_trylock()三个，不论哪种类型的锁，都不可能被两个不同的线程同时得到，而必须等待解锁。对于普通锁和适应锁类型，解锁者可以是同进程内任何线程；而检错锁则必须由加锁者解锁才有效，否则返回EPERM；对于嵌套锁，文档和实现要求必须由加锁者解锁，但实验结果表明并没有这种限制，这个不同目前还没有得到解释。在同一进程中的线程，如果加锁后没有解锁，则任何其他线程都无法再获得锁。</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>pthread_mutex_trylock()语义与pthread_mutex_lock()类似，不同的是在锁已经被占据时返回EBUSY而不是挂起等待。</p>
		<p>
				<a name="N10083">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4． 其他</font>
								</strong>
						</span>
				</a>
		</p>
		<p>POSIX线程锁机制的Linux实现都不是取消点，因此，延迟取消类型的线程不会因收到取消信号而离开加锁等待。值得注意的是，如果线程在加锁后解锁前被取消，锁将永远保持锁定状态，因此如果在关键区段内有取消点存在，或者设置了异步取消类型，则必须在退出回调函数中解锁。</p>
		<p>这个锁机制同时也不是异步信号安全的，也就是说，不应该在信号处理过程中使用互斥锁，否则容易造成死锁。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">条件变量</span>
				</a>
		</p>
		<p>条件变量是利用线程间共享的全局变量进行同步的一种机制，主要包括两个动作：一个线程等待"条件变量的条件成立"而挂起；另一个线程使"条件成立"（给出条件成立信号）。为了防止竞争，条件变量的使用总是和一个互斥锁结合在一起。</p>
		<p>
				<a name="N10098">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1． 创建和注销</font>
								</strong>
						</span>
				</a>
		</p>
		<p>条件变量和互斥锁一样，都有静态动态两种创建方式，静态方式使用PTHREAD_COND_INITIALIZER常量，如下： <br />pthread_cond_t cond=PTHREAD_COND_INITIALIZER </p>
		<p>动态方式调用pthread_cond_init()函数，API定义如下： <br />int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) </p>
		<p>尽管POSIX标准中为条件变量定义了属性，但在LinuxThreads中没有实现，因此cond_attr值通常为NULL，且被忽略。</p>
		<p>注销一个条件变量需要调用pthread_cond_destroy()，只有在没有线程在该条件变量上等待的时候才能注销这个条件变量，否则返回EBUSY。因为Linux实现的条件变量没有分配什么资源，所以注销动作只包括检查是否有等待线程。API定义如下： <br />int pthread_cond_destroy(pthread_cond_t *cond) </p>
		<p>
				<a name="N100B0">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2． 等待和激发</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>等待条件有两种方式：无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait()，其中计时等待方式如果在给定时刻前条件没有满足，则返回ETIMEOUT，结束等待，其中abstime以与time()系统调用相同意义的绝对时间形式出现，0表示格林尼治时间1970年1月1日0时0分0秒。</p>
		<p>无论哪种等待方式，都必须和一个互斥锁配合，以防止多个线程同时请求pthread_cond_wait()（或pthread_cond_timedwait()，下同）的竞争条件（Race Condition）。mutex互斥锁必须是普通锁（PTHREAD_MUTEX_TIMED_NP）或者适应锁（PTHREAD_MUTEX_ADAPTIVE_NP），且在调用pthread_cond_wait()前必须由本线程加锁（pthread_mutex_lock()），而在更新条件等待队列以前，mutex保持锁定状态，并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前，mutex将被重新加锁，以与进入pthread_cond_wait()前的加锁动作对应。</p>
		<p>激发条件有两种形式，pthread_cond_signal()激活一个等待该条件的线程，存在多个等待线程时按入队顺序激活其中一个；而pthread_cond_broadcast()则激活所有等待线程。</p>
		<p>
				<a name="N100C6">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3． 其他</font>
								</strong>
						</span>
				</a>
		</p>
		<p>pthread_cond_wait()和pthread_cond_timedwait()都被实现为取消点，因此，在该处等待的线程将立即重新运行，在重新锁定mutex后离开pthread_cond_wait()，然后执行取消动作。也就是说如果pthread_cond_wait()被取消，mutex是保持锁定状态的，因而需要定义退出回调函数来为其解锁。</p>
		<p>以下示例集中演示了互斥锁和条件变量的结合使用，以及取消对于条件等待动作的影响。在例子中，有两个线程被启动，并等待同一个条件变量，如果不使用退出回调函数（见范例中的注释部分），则tid2将在pthread_mutex_lock()处永久等待。如果使用回调函数，则tid2的条件等待及主线程的条件激发都能正常工作。</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">#include &lt;stdio.h&gt;
#include &lt;pthread.h&gt;
#include &lt;unistd.h&gt;
pthread_mutex_t mutex;
pthread_cond_t  cond;
void * child1(void *arg)
{
        pthread_cleanup_push(pthread_mutex_unlock,&amp;mutex);  /* comment 1 */
        while(1){
                printf("thread 1 get running \n");
        printf("thread 1 pthread_mutex_lock returns %d\n",
pthread_mutex_lock(&amp;mutex));
        pthread_cond_wait(&amp;cond,&amp;mutex);
                    printf("thread 1 condition applied\n");
        pthread_mutex_unlock(&amp;mutex);
                    sleep(5);
    }
        pthread_cleanup_pop(0);     /* comment 2 */
}
void *child2(void *arg)
{
        while(1){
                sleep(3);               /* comment 3 */
                printf("thread 2 get running.\n");
        printf("thread 2 pthread_mutex_lock returns %d\n",
pthread_mutex_lock(&amp;mutex));
        pthread_cond_wait(&amp;cond,&amp;mutex);
        printf("thread 2 condition applied\n");
        pthread_mutex_unlock(&amp;mutex);
        sleep(1);
        }
}
int main(void)
{
        int tid1,tid2;
        printf("hello, condition variable test\n");
        pthread_mutex_init(&amp;mutex,NULL);
        pthread_cond_init(&amp;cond,NULL);
        pthread_create(&amp;tid1,NULL,child1,NULL);
        pthread_create(&amp;tid2,NULL,child2,NULL);
        do{
        sleep(2);                   /* comment 4 */
                pthread_cancel(tid1);       /* comment 5 */
                sleep(2);                   /* comment 6 */
        pthread_cond_signal(&amp;cond);
    }while(1);  
        sleep(100);
        pthread_exit(0);
}</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果不做注释5的pthread_cancel()动作，即使没有那些sleep()延时操作，child1和child2都能正常工作。注释3和注释4的延迟使得child1有时间完成取消动作，从而使child2能在child1退出之后进入请求锁操作。如果没有注释1和注释2的回调函数定义，系统将挂起在child2请求锁的地方；而如果同时也不做注释3和注释4的延时，child2能在child1完成取消动作以前得到控制，从而顺利执行申请锁的操作，但却可能挂起在pthread_cond_wait()中，因为其中也有申请mutex的操作。child1函数给出的是标准的条件变量的使用方式：回调函数保护，等待条件前锁定，pthread_cond_wait()返回后解锁。</p>
		<p>条件变量机制不是异步信号安全的，也就是说，在信号处理函数中调用pthread_cond_signal()或者pthread_cond_broadcast()很可能引起死锁。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">信号灯</span>
				</a>
		</p>
		<p>信号灯与互斥锁和条件变量的主要不同在于"灯"的概念，灯亮则意味着资源可用，灯灭则意味着不可用。如果说后两中同步方式侧重于"等待"操作，即资源不可用的话，信号灯机制则侧重于点灯，即告知资源可用；没有等待线程的解锁或激发条件都是没有意义的，而没有等待灯亮的线程的点灯操作则有效，且能保持灯亮状态。当然，这样的操作原语也意味着更多的开销。</p>
		<p>信号灯的应用除了灯亮/灯灭这种二元灯以外，也可以采用大于1的灯数，以表示资源数大于1，这时可以称之为多元灯。</p>
		<p>
				<a name="N100E8">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1． 创建和注销</font>
								</strong>
						</span>
				</a>
		</p>
		<p>POSIX信号灯标准定义了有名信号灯和无名信号灯两种，但LinuxThreads的实现仅有无名灯，同时有名灯除了总是可用于多进程之间以外，在使用上与无名灯并没有很大的区别，因此下面仅就无名灯进行讨论。</p>
		<p>int sem_init(sem_t *sem, int pshared, unsigned int value) <br />这是创建信号灯的API，其中value为信号灯的初值，pshared表示是否为多进程共享而不仅仅是用于一个进程。LinuxThreads没有实现多进程共享信号灯，因此所有非0值的pshared输入都将使sem_init()返回-1，且置errno为ENOSYS。初始化好的信号灯由sem变量表征，用于以下点灯、灭灯操作。 </p>
		<p>int sem_destroy(sem_t * sem) <br />被注销的信号灯sem要求已没有线程在等待该信号灯，否则返回-1，且置errno为EBUSY。除此之外，LinuxThreads的信号灯注销函数不做其他动作。 </p>
		<p>
				<a name="N100FB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2． 点灯和灭灯</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">int sem_post(sem_t * sem)</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />点灯操作将信号灯值原子地加1，表示增加一个可访问的资源。 <p></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">int sem_wait(sem_t * sem)
int sem_trywait(sem_t * sem)
</pre></td></tr></tbody></table><br />sem_wait()为等待灯亮操作，等待灯亮（信号灯值大于0），然后将信号灯原子地减1，并返回。sem_trywait()为sem_wait()的非阻塞版，如果信号灯计数大于0，则原子地减1并返回0，否则立即返回-1，errno置为EAGAIN。 <p><a name="N1010F"><span class="smalltitle"><strong><font face="Arial">3． 获取灯值</font></strong></span></a></p><p></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">int sem_getvalue(sem_t * sem, int * sval)</pre></td></tr></tbody></table><br />读取sem中的灯计数，存于*sval中，并返回0。 <p><a name="N1011C"><span class="smalltitle"><strong><font face="Arial">4． 其他</font></strong></span></a></p><p>sem_wait()被实现为取消点，而且在支持原子"比较且交换"指令的体系结构上，sem_post()是唯一能用于异步信号处理函数的POSIX异步信号安全的API。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="4"><span class="atitle">异步信号</span></a></p><p>由于LinuxThreads是在核外使用核内轻量级进程实现的线程，所以基于内核的异步信号操作对于线程也是有效的。但同时，由于异步信号总是实际发往某个进程，所以无法实现POSIX标准所要求的"信号到达某个进程，然后再由该进程将信号分发到所有没有阻塞该信号的线程中"原语，而是只能影响到其中一个线程。</p><p>POSIX异步信号同时也是一个标准C库提供的功能，主要包括信号集管理（sigemptyset()、sigfillset()、sigaddset()、sigdelset()、sigismember()等）、信号处理函数安装（sigaction()）、信号阻塞控制（sigprocmask()）、被阻塞信号查询（sigpending()）、信号等待(sigsuspend())等，它们与发送信号的kill()等函数配合就能实现进程间异步信号功能。LinuxThreads围绕线程封装了sigaction()何raise()，本节集中讨论LinuxThreads中扩展的异步信号函数，包括pthread_sigmask()、pthread_kill()和sigwait()三个函数。毫无疑问，所有POSIX异步信号函数对于线程都是可用的。</p><p>int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask) <br />设置线程的信号屏蔽码，语义与sigprocmask()相同，但对不允许屏蔽的Cancel信号和不允许响应的Restart信号进行了保护。被屏蔽的信号保存在信号队列中，可由sigpending()函数取出。 </p><p>int pthread_kill(pthread_t thread, int signo) <br />向thread号线程发送signo信号。实现中在通过thread线程号定位到对应进程号以后使用kill()系统调用完成发送。 </p><p>int sigwait(const sigset_t *set, int *sig) <br />挂起线程，等待set中指定的信号之一到达，并将到达的信号存入*sig中。POSIX标准建议在调用sigwait()等待信号以前，进程中所有线程都应屏蔽该信号，以保证仅有sigwait()的调用者获得该信号，因此，对于需要等待同步的异步信号，总是应该在创建任何线程以前调用pthread_sigmask()屏蔽该信号的处理。而且，调用sigwait()期间，原来附接在该信号上的信号处理函数不会被调用。 </p><p>如果在等待期间接收到Cancel信号，则立即退出等待，也就是说sigwait()被实现为取消点。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="5"><span class="atitle">其他同步方式</span></a></p><p>除了上述讨论的同步方式以外，其他很多进程间通信手段对于LinuxThreads也是可用的，比如基于文件系统的IPC（管道、Unix域Socket等）、消息队列（Sys.V或者Posix的）、System V的信号灯等。只有一点需要注意，LinuxThreads在核内是作为共享存储区、共享文件系统属性、共享信号处理、共享文件描述符的独立进程看待的。</p><img src ="http://www.cnitblog.com/guopingleee/aggbug/31369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-07 10:52 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/07/31369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>