<?xml version="1.0" encoding="GB2312"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en"> 
<title><![CDATA[zhoulifa]]></title>
<link rel="alternate" type="text/html" href="http://zhoulifa.bokee.com/index.html" /> 
<modified>2008-09-29T20:16:32Z</modified> 
<tagline type="text/html" mode="escaped"><![CDATA[欢迎访问<b>周立发</b>的网站，在这里，我争取<font color=blue size=+1>每天进一步！</font>希望朋友您也可以获益！<br>
<a href="/4693094.html"><font size=+1 color=#FF0000>本人简历</font></a><font size=+3>     </font><a href="2851729.html"><font size=+1 color=#FF0000>免费下载</font></a><font size=+3>     </font><a href="2851646.html"><font size=+1 color=#FF0000>项目合作</font></a><font size=+3>     </font><a href="2851939.html"><font size=+1 color=#FF0000>友情捐赠</font></a>]]></tagline> 
<generator url="http://www.blogdriver.com/" version="2.0">BlogDriver</generator> 
<copyright>Copyright (c) 2004, zhoulifa</copyright> 

<entry> 
<title><![CDATA[Linux网络编程一步一步学-多字节数据的收发（上）]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6691562.html" />  
<issued>2008-04-20T19:40:08Z</issued> 
<created>2008-04-20T19:40:08Z</created> 
<modified>2008-04-20T19:40:08Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6691562</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[首先</font />，必须说明的是网络上的数据是<font color="#ff0000">流式传送</font>的，也就是经常说的stream，流式传送的特点就是一方发送的是1234四个字节，那么接收端收到的必然是1234四个字节，顺序完全相同。<br /><font size="4">其次</font>，必须说明的是<font color="#ff0000">主机字节序</font>，不同CPU保存数据的方式不同，即高位在前还是低位在前的问题的，大家可以自己google搜索一下“big little endian CPU”会发现很多人解释这个问题。对于单个字节的数据，即存储空间占用1Byte的数据，没有任何问题，但由于数据很大，通常1Byte表示不了，就必须引入多字节表示的数据，比如一个int通常为32个bit的数据，即4Byte表示一个int，那么当你定义一个int型变量x时，它的值可能是0x1234，即x=0x1234；但如果是另外一种顺序，则x=0x4321，显然这两个数相差很大。big-endian和little-endian问题简单说来就是对于同样的4个字节1234，一种顺序表示为1234，另一种顺序可能表示为4321。这就象中文表示姓名和英文表示姓名的顺序不一样，中国人姓名表示时姓在前名在后，而英文习惯里表示姓名时名在前姓在后，对于汉语的zhou lifa，英文里可能写成lifa zhou。如果双方不知道这个差别，英文习惯的人听汉语的人说人名zhou lifa里必然以为是姓lifa的叫zhou的人。<br />你可以用这个程序来测试你的主机字节序：<p /><p><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td>#include &amp;lt;stdio.h&amp;gt;<endian.h /><br />#include &amp;lt;endian.h&amp;gt;<stdio.h /><br />int main(void)<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;big:%d little:%d mine:%d\n&amp;quot;, __BIG_ENDIAN, __LITTLE_ENDIAN, __BYTE_ORDER);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;<br />}</td></tr></tbody></table></p><p><font size="4">因此</font>，基于上述两点我们就明白了“多字节数据传送必须要关注数据顺序”。对于单字节的数据，比如char型的，没有问题，所以在前面所有例子程序中，一个程序发送“hello, Linux”，另一个程序必然同样收到这样的字符串而不会顺序乱了。但如果你在这边发过去四个字节1234表示一个int数据，对方接收到以后不知道你的机器是big-endian还是little-endian，按照它自己的理解来解释这个数字，可能这个数字就是4321了。<br />好在前人已经想到这个问题了，因此网络编程基础“TCP/IP协议”里已经规定所有在网络上传送的数据统一采用big-endian顺序。因此，正确的网络编程方法是这样的：<br />如果你要发送纯字符串给对方，那么相当容易，可以这样：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td>char buf[] = &amp;quot;This is a test string&amp;quot;;<br />......<br />ret = send(socket_fd, buf, strlen(buf), 0);<br />......</td></tr></tbody></table></p><p>如果你要发送多字节数据，比如short,int,float,double,long……你必须先转换为big-endian序再发送，比如：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td>int age = 30;<br />……<br />age = htonl(age);<br />ret = send(socket_fd, (void *)&amp;amp;age, sizeof(int), 0);<br />……</td></tr></tbody></table></p><p>这里涉及一些网络字节序和主机字节序转换的函数，把主机(host)字节序转换为网络(network)字节序用到htons,htonl等函数，反之则用ntohs,ntohl等函数。man一下就知道这几个函数的用处和用法了。</p><p><font size="5">对于结构数据的传送</font><br />比如有这样一个表示人员信息的结构：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td>struct member {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char name[32];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int age;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char gender;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char address[128];<br />};</td></tr></tbody></table></p><p>当你定义了一个变量struct member personalInfo并把personalInfo的各字段内容准备好了，如何把这个信息发送给对方呢？</p><p><font size="4">一种方法</font>：<br />发送和接收的双方都知道上述结构struct member的定义，因此，不管一个人的名字是几个字节，也不管这个人的住址信息是多少个字节，发送的一方可以这样写程序：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>struct member personalInfo;<br />......<br />ret = send(socket_fd, personalInfo.name, 32, 0);<br />......</p><p>personalInfo.age = htonl(personalInfo.age);<br />ret = send(socket_fd, (void *)&amp;amp;personalInfo.age, sizeof(int), 0);<br />......<br />ret = send(socket_fd, &amp;amp;personalInfo.gender, sizeof(char), 0);<br />......<br />ret = send(socket_fd, personalInfo.address, 128, 0);<br />......</p></td></tr></tbody></table></p><p>而接收一方则可以这样写程序：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>struct member personalInfo;<br />......<br />ret = recv(socket_fd, personalInfo.name, 32, 0);<br />......<br />ret = recv(socket_fd, (void *)&amp;amp;personalInfo.age, sizeof(int), 0);</p><p>personalInfo.age = ntohl(personalInfo.age);<br />......<br />ret = recv(socket_fd, &amp;amp;personalInfo.gender, sizeof(char), 0);<br />......<br />ret = recv(socket_fd, personalInfo.address, 128, 0);<br />......</p></td></tr></tbody></table></p><p><font color="#ff00ff">当然，这样写程序的前提仍然是双方都是32位或64位系统，如果一方是32位系统，他这里表示的sizeof(int)是32bit个字节，而另一方表示的是64bit，程序工作会有问题的。</font></p><p><font size="4">另一种方法</font>：<br />发送方这样写程序：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#pragma pack(1) /* 这一行应在定义struct member时写 */<br />struct member personalInfo;<br />......</p><p>personalInfo.age = htonl(personalInfo.age);<br />ret = send(socket_fd, (void *)&amp;amp;personalInfo, sizeof(struct member), 0);<br />......</p></td></tr></tbody></table></p><p>接收方这样写程序：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#pragma pack(1) /* 这一行应在定义struct member时写，不一定要写成1，关键是要与发送方的定义保持一致 */<br />struct member personalInfo;<br />......<br />ret = recv(socket_fd, (void *)&amp;amp;personalInfo, sizeof(struct member), 0);</p><p>personalInfo.age = ntohl(personalInfo.age);<br />......</p></td></tr></tbody></table></p><p><font color="#ff00ff">这种方法要注意的是双方有个一致的定义pack(1)即，按位对齐方式定义相同。在网上搜索“C pragma pack”会发现很多这样的讨论。</font></p><p><font color="#ff00ff"></font><br />当然也可以试试这几段代码的结果：</p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(1)</p><p>int main(void)</p><p>{</p><p>struct member {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char name[32];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int age;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char gender;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(2)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(3)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(4)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(5)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(6)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(7)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p><p /><p><font size="4"><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" align="baseline" border="1"><tbody><tr><td><p>#include &amp;lt;stdio.h&amp;gt;<stdio.h /></p><p>#pragma pack(8)</p><p>int main(void)</p><p>{</p><p>struct member {<br />char name[32];<br />int age;<br />char gender;<br />char address[128];<br />};</p><p>printf(&amp;quot;size is:%d\n&amp;quot;, sizeof(struct member));</p><p>return 0;</p><p>}</p></td></tr></tbody></table></font></p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-用fnmatch函数进行字符通配]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614603.html" />  
<issued>2008-01-27T20:38:22Z</issued> 
<created>2008-01-27T20:38:22Z</created> 
<modified>2008-01-27T20:38:22Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614603</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子用fnmatch函数进行字符通配，比如匹配*、?等字符。<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: fnmatch.c<br />*purpose: 说明用fnmatch进行字符匹配的方法<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 20:33 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include &amp;lt;locale.h&amp;gt;<br />#include &amp;lt;fnmatch.h&amp;gt;<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;sys/types.h&amp;gt;<br />#include &amp;lt;dirent.h&amp;gt;<br /><br />main(int argc, char *argv[] )<br />{<br />&amp;#160; char&amp;#160;&amp;#160;&amp;#160; *pattern;<br />&amp;#160; DIR&amp;#160;&amp;#160;&amp;#160;&amp;#160; *dir;<br />&amp;#160; struct dirent&amp;#160;&amp;#160;&amp;#160; *entry;<br />&amp;#160; int&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret;<br /><br />&amp;#160; /*setlocale(LC_ALL, &amp;quot;zh_CN.UTF-8&amp;quot;);*/<br /><br />&amp;#160; dir = opendir(argv[2]);<br /><br />&amp;#160; pattern = argv[1];<br /><br />&amp;#160; if(dir != NULL){<br />&amp;#160;&amp;#160;&amp;#160; while( (entry = readdir(dir)) != NULL){<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = fnmatch(pattern, entry-&amp;gt;d_name, FNM_PATHNAME|FNM_PERIOD);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(ret == 0){<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%s\n&amp;quot;, entry-&amp;gt;d_name);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }else if(ret == FNM_NOMATCH){<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue ;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }else{<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;error file=%s\n&amp;quot;, entry-&amp;gt;d_name);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160; closedir(dir);<br />&amp;#160; }<br />}<br /><br /></td></tr></tbody></table>编译并运行此程序：<br />gcc -Wall fnmatch.c<br />./a.out &amp;quot;*.c&amp;quot; /src/mycode/c<br /><br />此命令将把/src/mycode/c目录下*.c文件显示出来。即匹配文件名为*.c的<br /><br /><br /><br /><br />
]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-关于union结构的理解方法]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614574.html" />  
<issued>2008-01-27T20:04:04Z</issued> 
<created>2008-01-27T20:04:04Z</created> 
<modified>2008-01-27T20:04:04Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614574</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子显示了unionx结构的内存存储情况<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: union.c<br />*purpose: 说明union结构<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 19:43 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;string.h&amp;gt;<br /><br />int main(void)<br />{<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; union {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int x;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char y[3];<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct x {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int x;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int y;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }z;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }xx;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memset(&amp;amp;xx, 0, sizeof(xx));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;0 %d x:%d y:%s z.x:%d z.y:%d\n&amp;quot;, sizeof(xx), xx.x, xx.y, xx.z.x, xx.z.y);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strcpy(xx.y, &amp;quot;ab&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;1 %d x:%d y:%s z.x:%d z.y:%d\n&amp;quot;, sizeof(xx), xx.x, xx.y, xx.z.x, xx.z.y);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xx.x=100;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;2 %d x:%d y:%s z.x:%d z.y:%d\n&amp;quot;, sizeof(xx), xx.x, xx.y, xx.z.x, xx.z.y);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xx.z.x=1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xx.z.y=2;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;3 %d x:%d y:%s z.x:%d z.y:%d\n&amp;quot;, sizeof(xx), xx.x, xx.y, xx.z.x, xx.z.y);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;<br />}<br /></td></tr></tbody></table><br />编译运行此程序：<br />gcc -Wall union.c<br />./a.out<br />得到如下输出结果：<br /><br /><font size="3">
0 8 x:0 y: z.x:0 z.y:0<br />1 8 x:25185 y:ab z.x:25185 z.y:0<br />2 8 x:100 y:d z.x:100 z.y:0<br />3 8 x:1 y: z.x:1 z.y:2<br /><br />为什么会得到这个结果呢？<br />因为union结构是对同一块内存区域的内容按照不同数据类型要求来处理的。<br />比如此程序中：xx这个结构的三个成员中，最大的是z，因为有两个int所以占8个字节，因此整个结构的size取最大的成员的size，得到8。因此有8个字节的内存区域 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00<br />当开始全置0时，无论如何理解，数值都是0，字符全为空。<br /><br />当把y的值置为ab时，xx结构理解为y，即内存区域是这样的：0x61 0x62 0x00 0x00 0x00 0x00 0x00 0x00一个字符串， 因为a的ASCII码值为0x61，b的ASCII码值为0x62。因此此时输出xx.y的值就是ab。但如果对同样这块内存区域0x61 0x62 0x00 0x00 0x00 0x00 0x00 0x00理解成一个int时，就取前4位为一个整数，即0x00006261(我这里是little-endiam)，因此此时打印zz.x值为25185，同样如果打印xx.z.x和xx.z.y的值就得到0x00006261和0x00000000，即25185和0<br /><br />当把xx.x的值置为100时，即0x64，内存区域变成了0x64 0x00 0x00 0x00 0x00 0x00 0x00 0x00，按照同样的理解，如果理解为一个整数则为0x00000064，即100，如果理解为字符串，则只有一个字符d(d的ASCII值为0x64,即100)，所以打印xx.y显示为d，同理zz.x=100而zz.y=0<br /><br />当最后xx.z.x=1,xx.z.y=2时，内存区域变成了0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00。同理理解<br /><br /></font>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-用waitpid检测子进程的退出状态]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614557.html" />  
<issued>2008-01-27T19:36:53Z</issued> 
<created>2008-01-27T19:36:53Z</created> 
<modified>2008-01-27T19:36:53Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614557</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子显示主进程如何获得子进程的退出状态，以便监测子进程。比如在子进程退出时重新启动它。<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: waitpid.c<br />*purpose: 显示主进程如何获得子进程的退出状态<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 19:33 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br /><br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;errno.h&amp;gt;<br />#include &amp;lt;unistd.h&amp;gt;<br />#include &amp;lt;sys/types.h&amp;gt;<br />#include &amp;lt;sys/wait.h&amp;gt;<br />#include &amp;lt;stdlib.h&amp;gt;<br /><br />int childprocess(void);<br />void signalHandle(int signo);<br /><br />int main(int argc, char ** argv)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pid_t chldpid = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int status = 0, ret = 0;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = fork();<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(ret) exit(0);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = fork();<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(ret &amp;lt; 0)&amp;#160;&amp;#160;&amp;#160;&amp;#160; {printf(&amp;quot;exit because fork error! errno:%d %s\n&amp;quot;, errno, strerror(errno));exit(1);}<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if(ret == 0)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {childprocess(); } /* run child process here. */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else {chldpid = ret; printf(&amp;quot;fork ok, child process pid=%d\n&amp;quot;, chldpid);}<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(1)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = waitpid(chldpid, &amp;amp;status, WNOHANG);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(ret == 0)&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;no child process exited now\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if(ret &amp;lt; 0)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;waitpid error. errno:%d %s\n&amp;quot;, errno, strerror(errno));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* if(errno == 10) childprocess(); */ /*如果子进程不存在了，重新启动它？ */<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(WIFEXITED(status))&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;child process exited sucessfully,&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;And it's exited code is:%d\n&amp;quot;, WEXITSTATUS(status));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if(WIFSIGNALED(status))&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;child process exited by signal,&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;And the signal code is:%d\n&amp;quot;, WTERMSIG(status));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if(WCOREDUMP(status))&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;child process exited with core dump\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;child process stopped or resumed\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; usleep(300000);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />}<br /><br />int childprocess(void)&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int i = 0;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal(SIGUSR1, signalHandle);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal(SIGTERM, signalHandle);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for(i = 1; i &amp;lt; 50; i++) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;I'm child process, loop.%d\n&amp;quot;, i);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; usleep(500000);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(i);<br />}<br /><br />void signalHandle(int signo) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch(signo)&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case&amp;#160;&amp;#160;&amp;#160; SIGUSR1:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;signal SIGUSR1 received! %s\n&amp;quot;, strsignal(SIGUSR1));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case&amp;#160;&amp;#160;&amp;#160; SIGTERM:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;signal SIGTERM received! %s\n&amp;quot;, strsignal(SIGTERM));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;other signal received!\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />}<br /><br /></td></tr></tbody></table>编译运行此程序：<br />gcc -Wall waitpid.c<br />./a.out<br />可以试着在另一个终端向用kill命令子进程发送一些信号看屏幕输出信息。<br /><br />当然，如果man waitpid可以看到一个示例代码如下：<br /><table><tbody><tr><td>&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;sys/wait.h&amp;gt;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;stdlib.h&amp;gt;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;unistd.h&amp;gt;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;stdio.h&amp;gt;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; main(int argc, char *argv[])<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pid_t cpid, w;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int status;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cpid = fork();<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cpid == -1) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; perror(&amp;quot;fork&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_FAILURE);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cpid == 0) {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* Code executed by child */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Child PID is %ld\n&amp;quot;, (long) getpid());<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (argc == 1)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pause();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* Wait for signals */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _exit(atoi(argv[1]));<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* Code executed by parent */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; do {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; w = waitpid(cpid, &amp;amp;status, WUNTRACED | WCONTINUED);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (w == -1) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; perror(&amp;quot;waitpid&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_FAILURE);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (WIFEXITED(status)) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;exited, status=%d\n&amp;quot;, WEXITSTATUS(status));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else if (WIFSIGNALED(status)) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;killed by signal %d\n&amp;quot;, WTERMSIG(status));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else if (WIFSTOPPED(status)) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;stopped by signal %d\n&amp;quot;, WSTOPSIG(status));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else if (WIFCONTINUED(status)) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;continued\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } while (!WIFEXITED(status) &amp;amp;&amp;amp; !WIFSIGNALED(status));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_SUCCESS);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br /></td></tr></tbody></table><br /><br />
]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-用ASCII码控制字模拟top命令在固定位置显示信息]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614544.html" />  
<issued>2008-01-27T19:19:11Z</issued> 
<created>2008-01-27T19:19:11Z</created> 
<modified>2008-01-27T19:19:11Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614544</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子说明运用ASCII控制字在固定位置显示字符的方法<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: top.c<br />*purpose: 说明运用ASCII控制字在固定位置显示字符的方法<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 19:13 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include&amp;lt;stdio.h&amp;gt;<br />#include&amp;lt;stdlib.h&amp;gt;<br />int main()<br />{<br />&amp;#160; int i=0;<br />&amp;#160; char *a[]={&amp;quot;hello&amp;quot;,&amp;quot;i am here&amp;quot;,&amp;quot;hahah&amp;quot;,&amp;quot;what do u think?&amp;quot;,&amp;quot;Great?&amp;quot;};<br />&amp;#160; system(&amp;quot;clear&amp;quot;);<br />&amp;#160; while(i&amp;lt;5)<br />&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\033[10;0H\033[K\033[20;0H%s\n&amp;quot;,a[i]);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i++;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sleep(1);<br />&amp;#160; }<br />}<br /></td></tr></tbody></table><br />编译并运行程序：<br />gcc -Wall top.c<br />./a.out<br /><br />关于终端上的ASCII控制字符的详细信息，参见“<a href="http://zhoulifa.bokee.com/5396159.html">用C语言自己编写一个more程序</a>”&amp;#160; <a href="http://zhoulifa.bokee.com/5396159.html">http://zhoulifa.bokee.com/5396159.html</a><br /><br />]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-mmap把文件映射到内存]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614538.html" />  
<issued>2008-01-27T19:08:34Z</issued> 
<created>2008-01-27T19:08:34Z</created> 
<modified>2008-01-27T19:08:34Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614538</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子显示了把文件映射到内存的方法<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: mmap.c<br />*purpose: 说明调用mmap把文件映射到内存的方法<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 18:59 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include &amp;lt;sys/mman.h&amp;gt;&amp;#160; /* for mmap and munmap */<br />#include &amp;lt;sys/types.h&amp;gt; /* for open */<br />#include &amp;lt;sys/stat.h&amp;gt;&amp;#160; /* for open */<br />#include &amp;lt;fcntl.h&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* for open */<br />#include &amp;lt;unistd.h&amp;gt;&amp;#160;&amp;#160;&amp;#160; /* for lseek and write */<br />#include &amp;lt;stdio.h&amp;gt;<br /><br />int main(int argc, char **argv)<br />{<br />&amp;#160;&amp;#160;&amp;#160; int fd;<br />&amp;#160;&amp;#160;&amp;#160; char *mapped_mem, * p;<br />&amp;#160;&amp;#160;&amp;#160; int flength = 1024;<br />&amp;#160;&amp;#160;&amp;#160; void * start_addr = 0;<br /><br />&amp;#160;&amp;#160;&amp;#160; fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);<br />&amp;#160;&amp;#160;&amp;#160; flength = lseek(fd, 1, SEEK_END);<br />&amp;#160;&amp;#160;&amp;#160; write(fd, &amp;quot;\0&amp;quot;, 1); /* 在文件最后添加一个空字符，以便下面printf正常工作 */<br />&amp;#160;&amp;#160;&amp;#160; lseek(fd, 0, SEEK_SET);<br />&amp;#160;&amp;#160;&amp;#160; mapped_mem = mmap(start_addr, flength, PROT_READ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //允许读<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MAP_PRIVATE,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //不允许其它进程访问此内存区域<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fd, 0);<br />&amp;#160;&amp;#160;&amp;#160; /* 使用映射区域. */<br />&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%s\n&amp;quot;, mapped_mem); /* 为了保证这里工作正常，参数传递的文件名最好是一个文本文件 */<br />&amp;#160;&amp;#160;&amp;#160; close(fd);<br />&amp;#160;&amp;#160;&amp;#160; munmap(mapped_mem, flength);<br />&amp;#160;&amp;#160;&amp;#160; return 0;<br />}<br /><br /></td></tr></tbody></table>编译运行此程序：<br />gcc -Wall mmap.c<br />./a.out text_filename<br /><br />上面的方法因为用了PROT_READ，所以只能读取文件里的内容，不能修改，如果换成PROT_WRITE就可以修改文件的内容了。又由于 用了MAAP_PRIVATE所以只能此进程使用此内存区域，如果换成MAP_SHARED，则可以被其它进程访问，比如下面的：<br /><table><tbody><tr><td>#include &amp;lt;sys/mman.h&amp;gt;&amp;#160; /* for mmap and munmap */<br />#include &amp;lt;sys/types.h&amp;gt; /* for open */<br />#include &amp;lt;sys/stat.h&amp;gt;&amp;#160; /* for open */<br />#include &amp;lt;fcntl.h&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* for open */<br />#include &amp;lt;unistd.h&amp;gt;&amp;#160;&amp;#160;&amp;#160; /* for lseek and write */<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;string.h&amp;gt; /* for memcpy */<br /><br />int main(int argc, char **argv)<br />{<br />&amp;#160;&amp;#160;&amp;#160; int fd;<br />&amp;#160;&amp;#160;&amp;#160; char *mapped_mem, * p;<br />&amp;#160;&amp;#160;&amp;#160; int flength = 1024;<br />&amp;#160;&amp;#160;&amp;#160; void * start_addr = 0;<br /><br />&amp;#160;&amp;#160;&amp;#160; fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);<br />&amp;#160;&amp;#160;&amp;#160; flength = lseek(fd, 1, SEEK_END);<br />&amp;#160;&amp;#160;&amp;#160; write(fd, &amp;quot;\0&amp;quot;, 1); /* 在文件最后添加一个空字符，以便下面printf正常工作 */<br />&amp;#160;&amp;#160;&amp;#160; lseek(fd, 0, SEEK_SET);<br />&amp;#160;&amp;#160;&amp;#160; start_addr = 0x80000;<br />&amp;#160;&amp;#160;&amp;#160; mapped_mem = mmap(start_addr, flength, PROT_READ|PROT_WRITE,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //允许写入<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MAP_SHARED,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //允许其它进程访问此内存区域<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fd, 0);<br />&amp;#160;&amp;#160;&amp;#160; /* 使用映射区域. */<br />&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%s\n&amp;quot;, mapped_mem); /* 为了保证这里工作正常，参数传递的文件名最好是一个文本文件 */<br />&amp;#160;&amp;#160;&amp;#160; while((p = strstr(mapped_mem, &amp;quot;Hello&amp;quot;))) { /* 此处来修改文件 内容 */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memcpy(p, &amp;quot;Linux&amp;quot;, 5);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p += 5;<br />&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160; close(fd);<br />&amp;#160;&amp;#160;&amp;#160; munmap(mapped_mem, flength);<br />&amp;#160;&amp;#160;&amp;#160; return 0;<br />}<br /><br /></td></tr></tbody></table><table style="width: 269px; height: 69px;"><tbody><tr><td>man -a mmap 看更详细的信息<br /></td></tr></tbody></table>之前的一个例子：<a href="http://zhoulifa.bokee.com/5603465.html">用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址</a> ，地址是： <a href="http://zhoulifa.bokee.com/5603465.html">http://zhoulifa.bokee.com/5603465.html</a><br /><br />
]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-调用getopt函数取得用户输入的选项和选项参数]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614454.html" />  
<issued>2008-01-27T17:08:09Z</issued> 
<created>2008-01-27T17:08:09Z</created> 
<modified>2008-01-27T17:08:09Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614454</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子是调用getopt函数取得用户输入的参数<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: getopt.c<br />*purpose: 说明getopt的用法<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 16:43 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />* Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />* Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include &amp;lt;unistd.h&amp;gt;<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;string.h&amp;gt;<br /><br />int main(int argc, char *argv[])<br />{<br />&amp;#160;&amp;#160;&amp;#160; int ret = 0;<br />&amp;#160;&amp;#160;&amp;#160; opterr = 0;<br />&amp;#160;&amp;#160;&amp;#160; while ((ret = getopt(argc, argv, &amp;quot;a:bc:h&amp;quot;)) != -1) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ret == '?')<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;unknow parameter\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;-%c parameter %s\n&amp;quot;, ret, (optarg &amp;amp;&amp;amp; (strlen(optarg) &amp;gt; 0)) ? optarg : &amp;quot;not needed&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160; return 0;<br />}<br /><br /></td></tr></tbody></table>编译此程序：<br />gcc -Wall getopt.c<br />运行程序：<br />./a.out #不带任何参数运行<br />./a.out -a<br />./a.out -aparama<br />./a.out -a parama<br />./a.out -aa -b<br />./a.out -aa -bb<br />./a.out -aa -b -cc -h -o<br /><br />带冒号&amp;quot;:&amp;quot;的选项是要有选项参数的，没有“:”的是不需要参数的。<br />如果man -a getopt，你将会看到在Linux Programmer's Manual这一章里有两个完整的例子，下面这个是用getopt的：<br /><br /><table><tbody><tr><td>&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;unistd.h&amp;gt;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;stdlib.h&amp;gt;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;stdio.h&amp;gt;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; main(int argc, char *argv[])<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int flags, opt;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int nsecs, tfnd;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nsecs = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tfnd = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; flags = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while ((opt = getopt(argc, argv, &amp;quot;nt:&amp;quot;)) != -1) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (opt) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 'n':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; flags = 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 't':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nsecs = atoi(optarg);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tfnd = 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default: /* '?' */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fprintf(stderr, &amp;quot;Usage: %s [-t nsecs] [-n] name\n&amp;quot;,<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argv[1]);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_FAILURE);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;flags=%d; tfnd=%d; optind=%d\n&amp;quot;, flags, tfnd, optind);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (optind &amp;gt;= argc) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fprintf(stderr, &amp;quot;Expected argument after options\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_FAILURE);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;name argument = %s\n&amp;quot;, argv[optind]);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* Other code omitted */<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_SUCCESS);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br /></td></tr></tbody></table>下面这个是调用getopt_long的例子：<br /><br /><table><tbody><tr><td>&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;stdio.h&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* for printf */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;stdlib.h&amp;gt;&amp;#160;&amp;#160;&amp;#160; /* for exit */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;getopt.h&amp;gt;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; main(int argc, char **argv)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int c;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int digit_optind = 0;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (1) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int this_option_optind = optind ? optind : 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int option_index = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static struct option long_options[] = {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;add&amp;quot;, 1, 0, 0},<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;append&amp;quot;, 0, 0, 0},<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;delete&amp;quot;, 1, 0, 0},<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;verbose&amp;quot;, 0, 0, 0},<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;create&amp;quot;, 1, 0, 'c'},<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;quot;file&amp;quot;, 1, 0, 0},<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {0, 0, 0, 0}<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = getopt_long(argc, argv, &amp;quot;abc:d:012&amp;quot;,<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long_options, &amp;amp;option_index);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (c == -1)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (c) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 0:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;option %s&amp;quot;, long_options[option_index].name);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (optarg)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot; with arg %s&amp;quot;, optarg);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case '0':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case '1':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case '2':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (digit_optind != 0 &amp;amp;&amp;amp; digit_optind != this_option_optind)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;digits occur in two different argv-elements.\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; digit_optind = this_option_optind;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;option %c\n&amp;quot;, c);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 'a':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;option a\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 'b':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;option b\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 'c':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;option c with value '%s'\n&amp;quot;, optarg);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case 'd':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;option d with value '%s'\n&amp;quot;, optarg);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case '?':<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;?? getopt returned character code 0%o ??\n&amp;quot;, c);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (optind &amp;lt; argc) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;non-option ARGV-elements: &amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (optind &amp;lt; argc)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%s &amp;quot;, argv[optind++]);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit(EXIT_SUCCESS);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br /><br /></td></tr></tbody></table>我之前贴的代码中，也有用到getopt_long的例子，“Linux网络编程一步一步学-用C自己编写一个telnet服务器” 地址是： http://zhoulifa.bokee.com/6071872.html<br />在googel或百度(baidu.com)中输入“getopt_long site:zhoulifa.bokee.com”就可以搜索到了。<br /><br /><font size="3">需要补充说明一点的是Linux下一个命令通常带选项和参数支持短格式和长格式两种。<br />短格式比如：<br />command -h #这就是这个命令只有一个选项h，并且h不带任何参数<br />对应的长格式比如：<br />command --help #这就是这个命令只有一个选项help，并且help不带任何参数<br />如果一个选项带有参数，那称之为选项参数，比如：<br />command -f filename #这就是这个命令只有一个选项f，并且f需要带参数表明文件名<br />对应的长格式可能是：<br />command --filename yourfilename #这就是这个命令只有一个选项filename，并且f需要带参数表明文件名<br /><br /><br /></font>
]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-goto的用法例子]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614435.html" />  
<issued>2008-01-27T16:31:16Z</issued> 
<created>2008-01-27T16:31:16Z</created> 
<modified>2008-01-27T16:31:16Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614435</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子展示了goto的用法<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: goto.c<br />*purpose: 展示了goto的用法 <br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 16:33 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;string.h&amp;gt;<br />#include &amp;lt;stdlib.h&amp;gt;<br />char * p1, * p2, * p3;<br />/*<br />&amp;#160;* return value:0 successful, -1 failed<br />*/<br />int init(void)<br />{<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p1 = (char *)malloc(100);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(p1)&amp;#160; memset(p1, 0, 100);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else goto real_exit;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p2 = (char *)malloc(100);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(p2)&amp;#160; memset(p2, 0, 100);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else goto free_p1;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p3 = (char *)malloc(100);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(p3)&amp;#160; memset(p3, 0, 100);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else goto free_p2;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;<br />free_p2:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(p2);<br />free_p1:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(p1);<br />real_exit:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return -1;<br />}<br /><br />int main(void)<br />{<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int ret = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = init();<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while(!ret) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; scanf(&amp;quot;%s %s %s&amp;quot;, p1, p2, p3);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;%s %s %s\n&amp;quot;, p1, p2, p3);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(!strcmp(p1, &amp;quot;quit&amp;quot;)) break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(p3);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(p2);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; free(p1);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;<br />}<br /></td></tr></tbody></table><br />编译此程序：<br />gcc -Wall goto.c<br />运行：<br />./a.out<br /><br />最值得欣赏的是init函数中的几个goto，<font size="4">保证了任何失败都不会产生内存泄露。</font><br /><br />]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-setitimer 设置“闹钟”]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614107.html" />  
<issued>2008-01-27T00:51:00Z</issued> 
<created>2008-01-27T00:51:00Z</created> 
<modified>2008-01-27T00:51:00Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614107</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[
应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子显示了设置闹钟的方法。<br /><br />源代码是：<br /><table><tbody><tr><td>#include &amp;lt;signal.h&amp;gt;<br />#include &amp;lt;unistd.h&amp;gt;<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;sys/time.h&amp;gt;<br /><signal.h><unistd.h><stdio.h><sys time.h="">/************关于本文档********************************************<br />*filename: setitimer.c<br />*purpose: 显示了设置闹钟的方法<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-26 2333 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*                Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*                Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />void sigroutine(int signo) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (signo) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case SIGALRM:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Catch a signal -- SIGALRM\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case SIGVTALRM:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Catch a signal -- SIGVTALRM\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />}<br /><br />int main(int argc, char ** argv) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct itimerval value,ovalue,value2;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;process id is %d\n&amp;quot;,getpid());<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal(SIGALRM, sigroutine);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal(SIGVTALRM, sigroutine);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_value.tv_sec = 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_value.tv_usec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_interval.tv_sec = 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_interval.tv_usec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setitimer(ITIMER_REAL, &amp;amp;value, &amp;amp;ovalue); /* 这将每隔1秒钟后产生 SIGALRM 信号 */<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_value.tv_sec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_value.tv_usec = 500000;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_interval.tv_sec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_interval.tv_usec = 500000;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setitimer(ITIMER_VIRTUAL, &amp;amp;value2, &amp;amp;ovalue); /* 对于在运行的程序，这将每隔0.5秒钟后产生 SIGVTALRM 信号。在sleep时间内是不产生闹钟的 */<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (;;) ;<br />} <br /><br /><br /></sys></stdio.h></unistd.h></signal.h></td></tr></tbody></table>编译此程序：<br />gcc -Wall setitimer.c<br />运行程序：<br />./a.out<br /><br />man setitimer 得到如下内容：<br /><table><tbody><tr><td>SYNOPSIS<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #include &amp;lt;sys/time.h&amp;gt;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int getitimer(int which, struct itimerval *value);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int setitimer(int which, const struct itimerval *value,<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct itimerval *ovalue);<br /><br />DESCRIPTION<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; The system provides each process with three interval timers, each decrementing in a distinct time domain.&amp;#160; When any timer expires, a<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal is sent to the process, and the timer (potentially) restarts.<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ITIMER_REAL&amp;#160;&amp;#160;&amp;#160; decrements in real time, and delivers SIGALRM upon expiration.<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ITIMER_VIRTUAL decrements only when the process is executing, and delivers SIGVTALRM upon expiration.<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ITIMER_PROF&amp;#160;&amp;#160;&amp;#160; decrements both when the process executes and when the system is executing on behalf of the&amp;#160; process.&amp;#160;&amp;#160; Coupled&amp;#160; with<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ITIMER_VIRTUAL,&amp;#160; this&amp;#160; timer&amp;#160; is&amp;#160; usually used to profile the time spent by the application in user and kernel space.<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SIGPROF is delivered upon expiration.<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Timer values are defined by the following structures:<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct itimerval {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct timeval it_interval; /* next value */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct timeval it_value;&amp;#160;&amp;#160;&amp;#160; /* current value */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct timeval {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long tv_sec;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* seconds */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long tv_usec;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /* microseconds */<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; The function getitimer() fills the structure indicated by value with the current setting for the timer indicated by&amp;#160; which&amp;#160; (one&amp;#160; of<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ITIMER_REAL,&amp;#160; ITIMER_VIRTUAL, or ITIMER_PROF).&amp;#160; The element it_value is set to the amount of time remaining on the timer, or zero if<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; the timer is disabled.&amp;#160; Similarly, it_interval is set to the reset value.&amp;#160; The function setitimer() sets the indicated timer to&amp;#160; the<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value in value.&amp;#160; If ovalue is non-zero, the old value of the timer is stored there.<br /><br /><sys time.h=""></sys></td></tr></tbody></table>显然，我们首先设置it_value时间，这个时间就会自动减少，当减少到0时就会产生ITIMER信号，然后it_value将设置为it_interval的值重复上述闹钟计时过程。因此可以每隔一定时间“闹钟”一次。<br />而闹钟信号分为三种，ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF分别代表了当系统运行时产生闹钟、当进程在运行时产生闹钟、两种情况下都会产生。通常情况下，只要我们启动了程序闹钟，ITIMER_REAL计时就一定会持续进行；如果是ITIMER_VIRTUAL则只有在程序在运行时计时，如果你程序里有sleep之类的调用，则在sleep的时候是不会产生SIGVTALRM闹钟的。<br />比如下面这个代码将只会产生SIGALRM闹钟：<br /><br /><table><tbody><tr><td>#include &amp;lt;signal.h&amp;gt;<br />#include &amp;lt;unistd.h&amp;gt;<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;sys/time.h&amp;gt;<br /><br />void sigroutine(int signo) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (signo) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case SIGALRM:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Catch a signal -- SIGALRM\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case SIGVTALRM:<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;Catch a signal -- SIGVTALRM\n&amp;quot;);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />}<br /><br />int main(int argc, char ** argv) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; struct itimerval value,ovalue,value2;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int i = 0;<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;process id is %d\n&amp;quot;,getpid());<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal(SIGALRM, sigroutine);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; signal(SIGVTALRM, sigroutine);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_value.tv_sec = 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_value.tv_usec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_interval.tv_sec = 1;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value.it_interval.tv_usec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setitimer(ITIMER_REAL, &amp;amp;value, &amp;amp;ovalue);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_value.tv_sec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_value.tv_usec = 500000;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_interval.tv_sec = 0;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value2.it_interval.tv_usec = 500000;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; setitimer(ITIMER_VIRTUAL, &amp;amp;value2, &amp;amp;ovalue);<br /><br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 0; i &amp;lt; 50; i++) {<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; usleep(100000);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;<br />} <br /><br /></td></tr></tbody></table>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[我曾经用过的源代码-招聘员工时的一个考试题]]></title> 
<link rel="alternate" type="text/html" href="http://zhoulifa.blogchina.com/6614105.html" />  
<issued>2008-01-27T00:43:49Z</issued> 
<created>2008-01-27T00:43:49Z</created> 
<modified>2008-01-27T00:43:49Z</modified>
<id>tag:zhoulifa.blogchina.com,2008://6614105</id>
<author> 
<name>周立发</name> 
<url>http://zhoulifa.blogchina.com/index.html</url> 
<email>zhoulifa@163.com</email> 
</author> 
<dc:subject>C/C++编程</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://zhoulifa.blogchina.com/"> 
<![CDATA[应一些朋友的要求，我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。<br />这样有个好处就是我自己可以通过google随时搜索源代码例子，比如我想找udp编程的例子时，我就在google里输入：udp site:zhoulifa.bokee.com搜索，能看到我自己的源代码例子。<br /><br />下面这个例子是很久以前招聘新员工时的一道考试题<br /><br />源代码是：<br /><table><tbody><tr><td>/************关于本文档********************************************<br />*filename: exam001.c<br />*purpose: 测试应聘者对字符数组的理解<br />*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)<br />Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言<br />*date time:2008-01-27 00:13 上海大雪天，据说是多年不遇<br />*Note: 任何人可以任意复制代码并运用这些文档，当然包括你的商业用途<br />* 但请遵循GPL<br />*Thanks to:<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ubuntu 本程序在Ubuntu 7.10系统上测试完全正常<br />*&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Google.com 我通常通过google搜索发现许多有用的资料<br />*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力<br />* 科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！<br />*********************************************************************/<br />#include &amp;lt;stdio.h&amp;gt;<br />#include &amp;lt;string.h&amp;gt;<br />void func(char * str)<br />{<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;sizeof(str)=%d\n&amp;quot;, sizeof(str));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;strlen(str)=%d\n&amp;quot;, strlen(str));<br />}<br /><br />int main(void)<br />{<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int b[]={1,2,3,4,5,6};<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; char a[]=&amp;quot;123456789&amp;quot;;<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;sizeof(a)=%d\n&amp;quot;, sizeof(a));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; printf(&amp;quot;sizeof(b)=%d\n&amp;quot;, sizeof(b));<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; func(a);<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;<br />}<br /></td></tr></tbody></table><br />编译：<br />gcc -Wall exam001.c<br />请推断出执行程序时屏幕上的输出内容。<br /><br /><br /><br />
]]> 
</content> 
</entry>
 

</feed>
