﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天下-随笔分类-Linux编程</title><link>http://cppblog.com/aaxron/category/16904.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Thu, 15 Jan 2015 06:35:17 GMT</lastBuildDate><pubDate>Thu, 15 Jan 2015 06:35:17 GMT</pubDate><ttl>60</ttl><item><title>linux pipe的缓冲区大小限制测试</title><link>http://www.cppblog.com/aaxron/archive/2014/03/24/206312.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 24 Mar 2014 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2014/03/24/206312.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/206312.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2014/03/24/206312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/206312.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/206312.html</trackback:ping><description><![CDATA[<p>linux pipe的缓冲区大小限制测试<br />pipe()创建管道、采用默认方式的方式，即默认阻塞模式。<br />平台： <br />uname -a<br />Linux develop 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux<br />三个概念：<br />1、页缓冲区大小：4K<br />2、总缓冲区大小：64K</p>
<p>1、&lt;4K的数据立即发送，以页为单位<br />2、&gt;4K的数据，将会分成多个页的数据，分批发送。<br /><br />函数 write要么阻塞，要么成功（copy全部数据到内核缓冲区，不存在只copy部分数据的情况），异常换回-1<br /><br /></p><img src ="http://www.cppblog.com/aaxron/aggbug/206312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2014-03-24 15:45 <a href="http://www.cppblog.com/aaxron/archive/2014/03/24/206312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket服务端select模式+管道+多线程，select可以替换为epoll</title><link>http://www.cppblog.com/aaxron/archive/2014/03/24/206308.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 24 Mar 2014 02:35:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2014/03/24/206308.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/206308.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2014/03/24/206308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/206308.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/206308.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;PORT&nbsp;5006&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MAXDATASIZE&nbsp;4096</span><span style="color: #000000"><br /><br />typedef&nbsp;map</span><span style="color: #000000">&lt;</span><span style="color: #000000">unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">,sockaddr_in</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;socket_maptable_t;<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;process_client(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sockfd,sockaddr_in&nbsp;addr,</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;recvbuf,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len);<br /><br />socket_maptable_t&nbsp;socket_maptable;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fds[</span><span style="color: #000000">2</span><span style="color: #000000">];<br /><br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;dispatch_thread(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">arg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;buf[MAXDATASIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;arg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">fds[0]:%d,fds[1]:%d</span><span style="color: #000000">"</span><span style="color: #000000">,fds[</span><span style="color: #000000">0</span><span style="color: #000000">],fds[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;readed&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;read(fds[</span><span style="color: #000000">0</span><span style="color: #000000">],buf,MAXDATASIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">readed:%d\r\n%s</span><span style="color: #000000">"</span><span style="color: #000000">,readed,buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sock_fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;recv_size;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd_set&nbsp;read_set;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd_set&nbsp;all_set;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;listen_fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;connect_fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ready_size;<br />&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;addr_size;<br />&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;srv_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max_fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;errcode;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;recv_buf[MAXDATASIZE];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((listen_fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">Creating&nbsp;socket&nbsp;failed.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;opt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SO_REUSEADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;setsockopt(listen_fd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">opt,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(opt));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(</span><span style="color: #000000">&amp;</span><span style="color: #000000">srv_addr,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(srv_addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;srv_addr.sin_family</span><span style="color: #000000">=</span><span style="color: #000000">AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;srv_addr.sin_port</span><span style="color: #000000">=</span><span style="color: #000000">htons(PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;srv_addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;htonl&nbsp;(INADDR_ANY);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(bind(listen_fd,&nbsp;(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;sockaddr&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">srv_addr,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">Bind&nbsp;error.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(listen(listen_fd,BACKLOG)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">listen()&nbsp;error\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建管道</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;errcode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pipe(fds);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(errcode&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">pipe()&nbsp;error</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">pipe()&nbsp;succeed,fds[0]:%d,fds[1]:%d</span><span style="color: #000000">"</span><span style="color: #000000">,fds[</span><span style="color: #000000">0</span><span style="color: #000000">],fds[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建接收连接线程</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;dispatch_tid;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pthread_create(</span><span style="color: #000000">&amp;</span><span style="color: #000000">dispatch_tid,&nbsp;NULL,&nbsp;dispatch_thread,&nbsp;(</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000">)NULL))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">pthread_create()&nbsp;dispatch_thread&nbsp;error</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">pthread_create()&nbsp;dispatch_thread&nbsp;succeed</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;max_fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;listen_fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr_size</span><span style="color: #000000">=</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(sockaddr_in);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FD_ZERO(</span><span style="color: #000000">&amp;</span><span style="color: #000000">all_set);<br />&nbsp;&nbsp;&nbsp;&nbsp;FD_SET(listen_fd,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">all_set);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;socket_maptable_t::iterator&nbsp;iter;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_set&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;all_set;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ready_size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;select(max_fd</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">read_set,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;FD_ISSET(listen_fd,</span><span style="color: #000000">&amp;</span><span style="color: #000000">read_set)&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connect_fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;accept(listen_fd,(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;sockaddr&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">addr,</span><span style="color: #000000">&amp;</span><span style="color: #000000">addr_size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(connect_fd&nbsp;</span><span style="color: #000000">==-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">accept()&nbsp;error\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket_maptable[connect_fd]&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;connect_fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_SET(connect_fd,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">all_set);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">(%u)&nbsp;%s:%d&nbsp;connected,socket:%u</span><span style="color: #000000">"</span><span style="color: #000000">,socket_maptable.size(),inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),connect_fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket_maptable.begin();&nbsp;iter</span><span style="color: #000000">!=</span><span style="color: #000000">socket_maptable.end();&nbsp;iter</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock_fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">first;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">second;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;FD_ISSET(sock_fd,</span><span style="color: #000000">&amp;</span><span style="color: #000000">read_set)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recv_size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;recv(sock_fd,&nbsp;recv_buf,&nbsp;MAXDATASIZE,</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;bRet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(recv_size&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bRet&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;process_client(sock_fd,addr,recv_buf,recv_size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">bRet)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(sock_fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FD_CLR(sock_fd,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">all_set);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket_maptable.erase(sock_fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">%s:%d&nbsp;disconnected\n</span><span style="color: #000000">"</span><span style="color: #000000">,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;close(listen_fd);<br />}<br /><br /><br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;process_client(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sockfd,sockaddr_in&nbsp;addr,</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;recvbuf,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;writed&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;write(fds[</span><span style="color: #000000">1</span><span style="color: #000000">],recvbuf,len);<br />&nbsp;&nbsp;&nbsp;&nbsp;pr_debug(</span><span style="color: #000000">"</span><span style="color: #000000">datalen:%d,writed:%d</span><span style="color: #000000">"</span><span style="color: #000000">,len,writed);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(writed</span><span style="color: #000000">==</span><span style="color: #000000">len);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />}<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/206308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2014-03-24 10:35 <a href="http://www.cppblog.com/aaxron/archive/2014/03/24/206308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>epoll中的LT和ET</title><link>http://www.cppblog.com/aaxron/archive/2014/03/21/206264.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 21 Mar 2014 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2014/03/21/206264.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/206264.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2014/03/21/206264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/206264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/206264.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">LT让我想起了linux内核的中断处理，设置中断触发标志<br /><br /><br />电平触发，就是只有高电平（或者低电平）的时候才做指定的事，&nbsp;&nbsp;<br />边沿触发，就是有高电平向低电平转换，或者翻过来转换，这个转换过程触发一个动作。<br /><br />电平就是逻辑上的0，1触发，&nbsp;&nbsp;<br />而边沿就是脉冲突变触发，逻辑上就是0－1或是1－</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;也就是上楼的那位表示的&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />通俗点讲吧&nbsp;&nbsp;<br />电平就是电压，高电平就是高电压，低电平就是低电压<br />高电平触发就是当电压为高时触发<br />边沿触发就是当电压由高变低或由低变高时触发<br />上升沿触发&nbsp;&nbsp;就是当电压从低变高时触发&nbsp;&nbsp;<br />下降沿触发&nbsp;&nbsp;就是当电压从高变低时触发<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />转个epoll的例子<br />http:</span><span style="color: #008000">//</span><span style="color: #008000">www.cppblog.com/API/archive/2013/12/01/204535.html&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">socket.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">epoll.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">netinet</span><span style="color: #000000">/</span><span style="color: #0000ff">in</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">arpa</span><span style="color: #000000">/</span><span style="color: #000000">inet.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fcntl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">unistd.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">pthread.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">errno.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MAXLINE&nbsp;10</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;OPEN_MAX&nbsp;100</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;LISTENQ&nbsp;20</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;SERV_PORT&nbsp;8006</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;INFTIM&nbsp;1000</span><span style="color: #000000"><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">线程池任务队列结构体</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;task{<br />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fd;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">需要读写的文件描述符</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;task&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">next;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">下一个任务</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />};<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">用于读写两个的两个方面传递参数</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;user_data{<br />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fd;<br />&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n_size;<br />&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;line[MAXLINE];<br />};<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">线程的任务函数</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;readtask(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">args);<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;writetask(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">args);<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;epoll_event&nbsp;ev,events[</span><span style="color: #000000">20</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;epfd;<br />pthread_mutex_t&nbsp;mutex;<br />pthread_cond_t&nbsp;cond1;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;task&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">readhead</span><span style="color: #000000">=</span><span style="color: #000000">NULL,</span><span style="color: #000000">*</span><span style="color: #000000">readtail</span><span style="color: #000000">=</span><span style="color: #000000">NULL,</span><span style="color: #000000">*</span><span style="color: #000000">writehead</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setnonblocking(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sock)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;opts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opts</span><span style="color: #000000">=</span><span style="color: #000000">fcntl(sock,F_GETFL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(opts</span><span style="color: #000000">&lt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000">"</span><span style="color: #000000">fcntl(sock,GETFL)</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;opts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;opts</span><span style="color: #000000">|</span><span style="color: #000000">O_NONBLOCK;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(fcntl(sock,F_SETFL,opts)</span><span style="color: #000000">&lt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000">"</span><span style="color: #000000">fcntl(sock,SETFL,opts)</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;maxi,&nbsp;listenfd,&nbsp;connfd,&nbsp;sockfd,nfds;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;tid1,tid2;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;task&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">new_task</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;user_data&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">rdata</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;clilen;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_init(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mutex,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_init(</span><span style="color: #000000">&amp;</span><span style="color: #000000">cond1,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">初始化用于读线程池的线程</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(</span><span style="color: #000000">&amp;</span><span style="color: #000000">tid1,NULL,readtask,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(</span><span style="color: #000000">&amp;</span><span style="color: #000000">tid2,NULL,readtask,NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">生成用于处理accept的epoll专用的文件描述符</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epfd</span><span style="color: #000000">=</span><span style="color: #000000">epoll_create(</span><span style="color: #000000">256</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;sockaddr_in&nbsp;clientaddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;sockaddr_in&nbsp;serveraddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listenfd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">把socket设置为非阻塞方式</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setnonblocking(listenfd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置与要处理的事件相关的文件描述符</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd</span><span style="color: #000000">=</span><span style="color: #000000">listenfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置要处理的事件类型</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.events</span><span style="color: #000000">=</span><span style="color: #000000">EPOLLIN</span><span style="color: #000000">|</span><span style="color: #000000">EPOLLET;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注册epoll事件</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,</span><span style="color: #000000">&amp;</span><span style="color: #000000">ev);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bzero(</span><span style="color: #000000">&amp;</span><span style="color: #000000">serveraddr,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(serveraddr));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serveraddr.sin_family&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serveraddr.sin_port</span><span style="color: #000000">=</span><span style="color: #000000">htons(SERV_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serveraddr.sin_addr.s_addr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INADDR_ANY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind(listenfd,(sockaddr&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">serveraddr,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(serveraddr));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen(listenfd,&nbsp;LISTENQ);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxi&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(&nbsp;;&nbsp;;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">等待epoll事件的发生</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfds</span><span style="color: #000000">=</span><span style="color: #000000">epoll_wait(epfd,events,</span><span style="color: #000000">20</span><span style="color: #000000">,</span><span style="color: #000000">500</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">处理所发生的所有事件</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">nfds;</span><span style="color: #000000">++</span><span style="color: #000000">i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(events[i].data.fd</span><span style="color: #000000">==</span><span style="color: #000000">listenfd)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connfd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;accept(listenfd,(sockaddr&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">clientaddr,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">clilen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(connfd</span><span style="color: #000000">&lt;</span><span style="color: #000000">0</span><span style="color: #000000">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000">"</span><span style="color: #000000">connfd&lt;0</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setnonblocking(connfd);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;inet_ntoa(clientaddr.sin_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">std::cout&lt;&lt;"connec_&nbsp;from&nbsp;&gt;&gt;"&lt;&lt;str&lt;&lt;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置用于读操作的文件描述符</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd</span><span style="color: #000000">=</span><span style="color: #000000">connfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置用于注测的读操作事件</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.events</span><span style="color: #000000">=</span><span style="color: #000000">EPOLLIN</span><span style="color: #000000">|</span><span style="color: #000000">EPOLLET;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注册ev</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,</span><span style="color: #000000">&amp;</span><span style="color: #000000">ev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(events[i].events</span><span style="color: #000000">&amp;</span><span style="color: #000000">EPOLLIN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">printf("reading!/n");</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;(sockfd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;events[i].data.fd)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_task</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;task();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_task</span><span style="color: #000000">-&gt;</span><span style="color: #000000">fd</span><span style="color: #000000">=</span><span style="color: #000000">sockfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_task</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">添加新的读任务</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mutex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(readhead</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readhead</span><span style="color: #000000">=</span><span style="color: #000000">new_task;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readtail</span><span style="color: #000000">=</span><span style="color: #000000">new_task;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readtail</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next</span><span style="color: #000000">=</span><span style="color: #000000">new_task;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readtail</span><span style="color: #000000">=</span><span style="color: #000000">new_task;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">唤醒所有等待cond1条件的线程</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_broadcast(</span><span style="color: #000000">&amp;</span><span style="color: #000000">cond1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mutex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(events[i].events</span><span style="color: #000000">&amp;</span><span style="color: #000000">EPOLLOUT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rdata=(struct&nbsp;user_data&nbsp;*)events[i].data.ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockfd&nbsp;=&nbsp;rdata-&gt;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(sockfd,&nbsp;rdata-&gt;line,&nbsp;rdata-&gt;n_size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;rdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置用于读操作的文件描述符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd=sockfd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置用于注测的读操作事件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.events=EPOLLIN|EPOLLET;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//修改sockfd上要处理的事件为EPOLIN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&amp;ev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count111&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;time_t&nbsp;oldtime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;nowtime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;readtask(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">args)<br />{<br /><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fd</span><span style="color: #000000">=-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于把读出来的数据传递出去</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;user_data&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">data&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mutex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">等待到任务队列不为空</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(readhead</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_wait(</span><span style="color: #000000">&amp;</span><span style="color: #000000">cond1,</span><span style="color: #000000">&amp;</span><span style="color: #000000">mutex);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd</span><span style="color: #000000">=</span><span style="color: #000000">readhead</span><span style="color: #000000">-&gt;</span><span style="color: #000000">fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">从任务队列取出一个读任务</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;task&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">tmp</span><span style="color: #000000">=</span><span style="color: #000000">readhead;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readhead&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;readhead</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">mutex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;user_data();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data</span><span style="color: #000000">-&gt;</span><span style="color: #000000">fd</span><span style="color: #000000">=</span><span style="color: #000000">fd;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;recvBuf[</span><span style="color: #000000">1024</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">0</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">999</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(rs)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;recv(fd,recvBuf,</span><span style="color: #000000">1024</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;接受客户端消息</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ret&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可</span><span style="color: #008000">//</span><span style="color: #008000">读在这里就当作是该次事件已处理过。</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(errno&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;EAGAIN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">EAGAIN\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">recv&nbsp;error!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ret&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;这里表示对端的socket已正常关闭.</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ret&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(recvBuf))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;需要再次读取</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ret</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">){<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">-------------------------------------------------------------------------------</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data</span><span style="color: #000000">-&gt;</span><span style="color: #000000">n_size</span><span style="color: #000000">=</span><span style="color: #000000">n;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count111&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;tm&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">today;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;ltime;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time(&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">nowtime&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(nowtime&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;oldtime){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;count111);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldtime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nowtime;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count111&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;buf[</span><span style="color: #000000">1000</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">0</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buf,</span><span style="color: #000000">"</span><span style="color: #000000">HTTP/1.0&nbsp;200&nbsp;OK\r\nContent-type:&nbsp;text/plain\r\n\r\n%s</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;world!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send(fd,buf,strlen(buf),</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/206264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2014-03-21 17:24 <a href="http://www.cppblog.com/aaxron/archive/2014/03/21/206264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>epoll使用</title><link>http://www.cppblog.com/aaxron/archive/2014/03/21/206263.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 21 Mar 2014 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2014/03/21/206263.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/206263.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2014/03/21/206263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/206263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/206263.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->epoll使用在linux的网络编程中，很长的时间都在使用select来做事件触发。在linux新的内核中，有了一种替换它的机制，就是epoll。相比于select，epoll最大的好处在于它不会随着监听...&nbsp;&nbsp;<a href='http://www.cppblog.com/aaxron/archive/2014/03/21/206263.html'>阅读全文</a><img src ="http://www.cppblog.com/aaxron/aggbug/206263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2014-03-21 16:56 <a href="http://www.cppblog.com/aaxron/archive/2014/03/21/206263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>arm-none-linux-gnueabi</title><link>http://www.cppblog.com/aaxron/archive/2013/05/27/200619.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 27 May 2013 07:51:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/05/27/200619.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/200619.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/05/27/200619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/200619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/200619.html</trackback:ping><description><![CDATA[<p>arm-none-linux-gnueabi<br />链接工具命名：<br />&nbsp;&nbsp;&nbsp; arch-vendor-(os-)abi</p>
<p>1、arm-none-linux-gnueabi (ARM architecture, no vendor, linux OS, and the gnueabi ABI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于编译ARM架构的u-boot、linux内核、linux应用等<br />2、arm-none-eabi <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于编译ARM架构的裸机系统(包括linux的 boot、kernel)<br />3、arm-eabi <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Android ARM 编译器</p>
<p>arm-none-linux-gnueabi交叉编译器是codesourcery公司推出的，基于GCC，但是进行过优化的编译器。官方网站<br /><a href="http://www.codesourcery.com/">http://www.codesourcery.com/</a><br />codesourcery推出的产品叫Sourcery G++ Lite Edition，其中基于command-line的编译器是免费的，在官网上可以下载，而其中包含的IDE和debug 工具是收费的，当然也有30天试用版本的。<br />arm-none-linux-gnueabi-xxx用它的最大理由我想应该是浮点运算。</p>
<p>结果测试发现: int backtrace(void **buffer,int size) 在实际使用过程中,只能打印出空的调用堆栈<br />而arm-linux-gcc可以!<br /></p><img src ="http://www.cppblog.com/aaxron/aggbug/200619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-05-27 15:51 <a href="http://www.cppblog.com/aaxron/archive/2013/05/27/200619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下利用backtrace追踪函数调用堆栈以及定位段错误</title><link>http://www.cppblog.com/aaxron/archive/2013/04/17/199511.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 17 Apr 2013 07:40:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/04/17/199511.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/199511.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/04/17/199511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/199511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/199511.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&lt;stdio.h&gt;<br />#include&lt;unistd.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;execinfo.h&gt;<br />#include&nbsp;&lt;signal.h&gt;<br /><br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">连接必须使用&nbsp;LDFLAGS=-rdynamic<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">$(CC)&nbsp;$(LDFLAGS)&nbsp;-o&nbsp;$@&nbsp;$^</span><span style="color: #008000; "><br />/*</span><span style="color: #008000; "><br />Linux下利用backtrace追踪函数调用堆栈以及定位段错误<br /><br />有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。<br /><br />在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。<br /><br />int&nbsp;backtrace(void&nbsp;**buffer,int&nbsp;size)&nbsp;<br /><br />该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数&nbsp;size&nbsp;用来指定buffer中可以保存多少个void*&nbsp;元素。函数返回值是实际获取的指针个数,最大不超过size大小<br /><br />在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址<br /><br />注意:某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会导致无法正确解析堆栈内容<br /><br />char&nbsp;**&nbsp;backtrace_symbols&nbsp;(void&nbsp;*const&nbsp;*buffer,&nbsp;int&nbsp;size)&nbsp;<br /><br />backtrace_symbols将从backtrace函数获取的信息转化为一个字符串数组.&nbsp;参数buffer应该是从backtrace函数获取的指针数组,size是该数组中的元素个数(backtrace的返回值)<br /><br />函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名，函数的偏移地址,和实际的返回地址<br /><br />现在,只有使用ELF二进制格式的程序才能获取函数名称和偏移地址.在其他系统,只有16进制的返回地址能被获取.另外,你可能需要传递相应的符号给链接器,以能支持函数名功能(比如,在使用GNU&nbsp;ld链接器的系统中,你需要传递(-rdynamic)，&nbsp;-rdynamic可用来通知链接器将所有符号添加到动态符号表中，如果你的链接器支持-rdynamic的话，建议将其加上！)<br /><br />该函数的返回值是通过malloc函数申请的空间,因此调用者必须使用free函数来释放指针.<br /><br />注意:如果不能为字符串获取足够的空间函数的返回值将会为NULL<br /><br />void&nbsp;backtrace_symbols_fd&nbsp;(void&nbsp;*const&nbsp;*buffer,&nbsp;int&nbsp;size,&nbsp;int&nbsp;fd)&nbsp;<br /><br />backtrace_symbols_fd与backtrace_symbols&nbsp;函数具有相同的功能,不同的是它不会给调用者返回字符串数组,而是将结果写入文件描述符为fd的文件中,每个函数对应一行.它不需要调用malloc函数,因此适用于有可能调用该函数会失败的情况<br /></span><span style="color: #008000; ">*/</span><br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;C(<span style="color: #0000FF; ">int</span>&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;p&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)c;<br />&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;'A';<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("function&nbsp;C&nbsp;run&nbsp;after,*p='%c'\r\n",*p);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;B(<span style="color: #0000FF; ">int</span>&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%d:&nbsp;B&nbsp;call&nbsp;C&nbsp;\r\n",b);<br />&nbsp;&nbsp;&nbsp;&nbsp;C(b+1);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;A(<span style="color: #0000FF; ">int</span>&nbsp;a)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%d:&nbsp;A&nbsp;call&nbsp;B&nbsp;\r\n",a);<br />&nbsp;&nbsp;&nbsp;&nbsp;B(2);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;debug_backtrace(<span style="color: #0000FF; ">int</span>&nbsp;dunno)<br />{<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;SIZE&nbsp;256<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;array[SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size,i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>**&nbsp;strings;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(dunno==SIGSEGV)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"\r\nSegmentation&nbsp;faul&nbsp;\r\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;backtrace(array,SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"\r\nBacktrace&nbsp;(%d&nbsp;deep):\r\n",size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings&nbsp;=&nbsp;backtrace_symbols(array,size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(i=0;i&lt;size;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"%d:%s\n",i,strings[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(strings);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;**argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;a&nbsp;=&nbsp;'T';<br />&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGSEGV,debug_backtrace);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;C((<span style="color: #0000FF; ">int</span>)&amp;a);<br />&nbsp;&nbsp;&nbsp;&nbsp;A(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/199511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-04-17 15:40 <a href="http://www.cppblog.com/aaxron/archive/2013/04/17/199511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux分析命令行参数getopt</title><link>http://www.cppblog.com/aaxron/archive/2013/04/16/199484.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 16 Apr 2013 07:40:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/04/16/199484.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/199484.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/04/16/199484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/199484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/199484.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->getopt<br />getopt（分析命令行参数）<br />相关函数<br />表头文件<br />#include&lt;unistd.h&gt;<br />定义函数:<br /><span style="color: #0000FF; ">int</span>&nbsp;getopt(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;argv[&nbsp;],<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;optstring);<br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*optarg;<br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;optind,&nbsp;opterr,&nbsp;optopt;<br />函数说明&nbsp;getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。<br />参数optstring为选项字符串，告知&nbsp;getopt()可以处理哪个选项以及哪个选项需要参数，如果选项字符串里的字母后接着冒号&#8220;:&#8221;，则表示还有相关的参数，<br />全域变量optarg&nbsp;即会指向此额外参数。如果在处理期间遇到了不符合optstring指定的其他选项getopt()将显示一个错误消息，并将全域变量optarg设为&#8220;?&#8221;字符，如果不希望getopt()打印出错信息，则只要将全域变量opterr设为0即可。<br />getopt()&nbsp;所设置的全局变量包括：<br />optarg&#8212;&#8212;指向当前选项参数（如果有）的指针。&nbsp;<br />optind&#8212;&#8212;再次调用&nbsp;getopt()&nbsp;时的下一个&nbsp;argv&nbsp;指针的索引。&nbsp;<br />optopt&#8212;&#8212;最后一个已知选项。<br />补充说明下optstring中的指定的内容的意义（例如getopt(argc,&nbsp;argv,&nbsp;"ab:c:de::");<br />1.单个字符，表示选项，（如上例中的abcde各为一个选项）<br />2.单个字符后接一个冒号：表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。（如上例中的b:c:）<br />3&nbsp;单个字符后跟两个冒号，表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::)</div><img src ="http://www.cppblog.com/aaxron/aggbug/199484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-04-16 15:40 <a href="http://www.cppblog.com/aaxron/archive/2013/04/16/199484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win32下使用getopt,从qt中弄了个getop.c</title><link>http://www.cppblog.com/aaxron/archive/2013/04/16/199482.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 16 Apr 2013 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/04/16/199482.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/199482.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/04/16/199482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/199482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/199482.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">getopt.h</span><span style="color: #008000; "><br /></span>#pragma&nbsp;once<br />#ifdef&nbsp;__cplusplus<br /><span style="color: #0000FF; ">extern</span>&nbsp;"C"&nbsp;{<br /><span style="color: #0000FF; ">#endif</span><br /><br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;opterr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;if&nbsp;error&nbsp;message&nbsp;should&nbsp;be&nbsp;printed&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;optind;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;index&nbsp;into&nbsp;parent&nbsp;argv&nbsp;vector&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;optopt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;character&nbsp;checked&nbsp;for&nbsp;validity&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;optreset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;reset&nbsp;getopt&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;&nbsp;&nbsp;&nbsp;*optarg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;argument&nbsp;associated&nbsp;with&nbsp;option&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">int</span>&nbsp;getopt(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;argv[],&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*optstring);<br /><br />#ifdef&nbsp;__cplusplus<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">#endif</span></div><br />
getopt.c 从qt中弄的,一行都没改<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">getopt.c&nbsp;从qt中弄的,一行都没改</span><span style="color: #008000; "><br />
</span><br />
<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;$Id:&nbsp;getopt.c,v&nbsp;1.2&nbsp;2005/07/07&nbsp;16:34:06&nbsp;dron&nbsp;Exp&nbsp;$&nbsp;</span><span style="color: #008000; ">*/</span><br />
<br />
<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;Copyright&nbsp;(c)&nbsp;1987,&nbsp;1993,&nbsp;1994<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;Regents&nbsp;of&nbsp;the&nbsp;University&nbsp;of&nbsp;California.&nbsp;&nbsp;All&nbsp;rights&nbsp;reserved.<br />
&nbsp;*<br />
&nbsp;*&nbsp;Redistribution&nbsp;and&nbsp;use&nbsp;in&nbsp;source&nbsp;and&nbsp;binary&nbsp;forms,&nbsp;with&nbsp;or&nbsp;without<br />
&nbsp;*&nbsp;modification,&nbsp;are&nbsp;permitted&nbsp;provided&nbsp;that&nbsp;the&nbsp;following&nbsp;conditions<br />
&nbsp;*&nbsp;are&nbsp;met:<br />
&nbsp;*&nbsp;1.&nbsp;Redistributions&nbsp;of&nbsp;source&nbsp;code&nbsp;must&nbsp;retain&nbsp;the&nbsp;above&nbsp;copyright<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;notice,&nbsp;this&nbsp;list&nbsp;of&nbsp;conditions&nbsp;and&nbsp;the&nbsp;following&nbsp;disclaimer.<br />
&nbsp;*&nbsp;2.&nbsp;Redistributions&nbsp;in&nbsp;binary&nbsp;form&nbsp;must&nbsp;reproduce&nbsp;the&nbsp;above&nbsp;copyright<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;notice,&nbsp;this&nbsp;list&nbsp;of&nbsp;conditions&nbsp;and&nbsp;the&nbsp;following&nbsp;disclaimer&nbsp;in&nbsp;the<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;documentation&nbsp;and/or&nbsp;other&nbsp;materials&nbsp;provided&nbsp;with&nbsp;the&nbsp;distribution.<br />
&nbsp;*&nbsp;3.&nbsp;Neither&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;University&nbsp;nor&nbsp;the&nbsp;names&nbsp;of&nbsp;its&nbsp;contributors<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;may&nbsp;be&nbsp;used&nbsp;to&nbsp;endorse&nbsp;or&nbsp;promote&nbsp;products&nbsp;derived&nbsp;from&nbsp;this&nbsp;software<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;without&nbsp;specific&nbsp;prior&nbsp;written&nbsp;permission.<br />
&nbsp;*<br />
&nbsp;*&nbsp;THIS&nbsp;SOFTWARE&nbsp;IS&nbsp;PROVIDED&nbsp;BY&nbsp;THE&nbsp;REGENTS&nbsp;AND&nbsp;CONTRIBUTORS&nbsp;``AS&nbsp;IS''&nbsp;AND<br />
&nbsp;*&nbsp;ANY&nbsp;EXPRESS&nbsp;OR&nbsp;IMPLIED&nbsp;WARRANTIES,&nbsp;INCLUDING,&nbsp;BUT&nbsp;NOT&nbsp;LIMITED&nbsp;TO,&nbsp;THE<br />
&nbsp;*&nbsp;IMPLIED&nbsp;WARRANTIES&nbsp;OF&nbsp;MERCHANTABILITY&nbsp;AND&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE<br />
&nbsp;*&nbsp;ARE&nbsp;DISCLAIMED.&nbsp;&nbsp;IN&nbsp;NO&nbsp;EVENT&nbsp;SHALL&nbsp;THE&nbsp;REGENTS&nbsp;OR&nbsp;CONTRIBUTORS&nbsp;BE&nbsp;LIABLE<br />
&nbsp;*&nbsp;FOR&nbsp;ANY&nbsp;DIRECT,&nbsp;INDIRECT,&nbsp;INCIDENTAL,&nbsp;SPECIAL,&nbsp;EXEMPLARY,&nbsp;OR&nbsp;CONSEQUENTIAL<br />
&nbsp;*&nbsp;DAMAGES&nbsp;(INCLUDING,&nbsp;BUT&nbsp;NOT&nbsp;LIMITED&nbsp;TO,&nbsp;PROCUREMENT&nbsp;OF&nbsp;SUBSTITUTE&nbsp;GOODS<br />
&nbsp;*&nbsp;OR&nbsp;SERVICES;&nbsp;LOSS&nbsp;OF&nbsp;USE,&nbsp;DATA,&nbsp;OR&nbsp;PROFITS;&nbsp;OR&nbsp;BUSINESS&nbsp;INTERRUPTION)<br />
&nbsp;*&nbsp;HOWEVER&nbsp;CAUSED&nbsp;AND&nbsp;ON&nbsp;ANY&nbsp;THEORY&nbsp;OF&nbsp;LIABILITY,&nbsp;WHETHER&nbsp;IN&nbsp;CONTRACT,&nbsp;STRICT<br />
&nbsp;*&nbsp;LIABILITY,&nbsp;OR&nbsp;TORT&nbsp;(INCLUDING&nbsp;NEGLIGENCE&nbsp;OR&nbsp;OTHERWISE)&nbsp;ARISING&nbsp;IN&nbsp;ANY&nbsp;WAY<br />
&nbsp;*&nbsp;OUT&nbsp;OF&nbsp;THE&nbsp;USE&nbsp;OF&nbsp;THIS&nbsp;SOFTWARE,&nbsp;EVEN&nbsp;IF&nbsp;ADVISED&nbsp;OF&nbsp;THE&nbsp;POSSIBILITY&nbsp;OF<br />
&nbsp;*&nbsp;SUCH&nbsp;DAMAGE.<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
<br />
<span style="color: #0000FF; ">#if</span>&nbsp;0<br />
<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;sccsid[]&nbsp;=&nbsp;"@(#)getopt.c&nbsp;&nbsp;&nbsp;&nbsp;8.3&nbsp;(Berkeley)&nbsp;4/27/95";<br />
__RCSID("$NetBSD:&nbsp;getopt.c,v&nbsp;1.26&nbsp;2003/08/07&nbsp;16:43:40&nbsp;agc&nbsp;Exp&nbsp;$");<br />
<span style="color: #0000FF; ">#endif</span><br />
<br />
#include&nbsp;&lt;stdio.h&gt;<br />
#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;opterr&nbsp;=&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;if&nbsp;error&nbsp;message&nbsp;should&nbsp;be&nbsp;printed&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;optind&nbsp;=&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;index&nbsp;into&nbsp;parent&nbsp;argv&nbsp;vector&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;optopt,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;character&nbsp;checked&nbsp;for&nbsp;validity&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;optreset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;reset&nbsp;getopt&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #0000FF; ">char</span>&nbsp;&nbsp;&nbsp;&nbsp;*optarg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;argument&nbsp;associated&nbsp;with&nbsp;option&nbsp;</span><span style="color: #008000; ">*/</span><br />
<br />
<span style="color: #0000FF; ">#define</span>&nbsp;&nbsp;&nbsp;&nbsp;BADCH&nbsp;&nbsp;&nbsp;&nbsp;(int)'?'<br />
<span style="color: #0000FF; ">#define</span>&nbsp;&nbsp;&nbsp;&nbsp;BADARG&nbsp;&nbsp;&nbsp;&nbsp;(int)':'<br />
<span style="color: #0000FF; ">#define</span>&nbsp;&nbsp;&nbsp;&nbsp;EMSG&nbsp;&nbsp;&nbsp;&nbsp;""<br />
<br />
<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;getopt&nbsp;--<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Parse&nbsp;argc/argv&nbsp;argument&nbsp;vector.<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #0000FF; ">int</span>&nbsp;getopt(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;argv[],&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*optstring)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*place&nbsp;=&nbsp;EMSG;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;option&nbsp;letter&nbsp;processing&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*oli;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;option&nbsp;letter&nbsp;list&nbsp;index&nbsp;</span><span style="color: #008000; ">*/</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(optreset&nbsp;||&nbsp;*place&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;update&nbsp;scanning&nbsp;pointer&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optreset&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;=&nbsp;argv[optind];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(optind&nbsp;&gt;=&nbsp;argc&nbsp;||&nbsp;*place++&nbsp;!=&nbsp;'-')&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Argument&nbsp;is&nbsp;absent&nbsp;or&nbsp;is&nbsp;not&nbsp;an&nbsp;option&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;=&nbsp;EMSG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optopt&nbsp;=&nbsp;*place++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(optopt&nbsp;==&nbsp;'-'&nbsp;&amp;&amp;&nbsp;*place&nbsp;==&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;"--"&nbsp;=&gt;&nbsp;end&nbsp;of&nbsp;options&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++optind;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;=&nbsp;EMSG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(optopt&nbsp;==&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Solitary&nbsp;'-',&nbsp;treat&nbsp;as&nbsp;a&nbsp;'-'&nbsp;option<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;the&nbsp;program&nbsp;(eg&nbsp;su)&nbsp;is&nbsp;looking&nbsp;for&nbsp;it.&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;=&nbsp;EMSG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(strchr(optstring,&nbsp;'-')&nbsp;==&nbsp;NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optopt&nbsp;=&nbsp;'-';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optopt&nbsp;=&nbsp;*place++;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;See&nbsp;if&nbsp;option&nbsp;letter&nbsp;is&nbsp;one&nbsp;the&nbsp;caller&nbsp;wanted<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(optopt&nbsp;==&nbsp;':'&nbsp;||&nbsp;(oli&nbsp;=&nbsp;strchr(optstring,&nbsp;optopt))&nbsp;==&nbsp;NULL)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*place&nbsp;==&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++optind;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(opterr&nbsp;&amp;&amp;&nbsp;*optstring&nbsp;!=&nbsp;':')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">void</span>)fprintf(stderr,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"unknown&nbsp;option&nbsp;--&nbsp;%c\n",&nbsp;optopt);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(BADCH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Does&nbsp;this&nbsp;option&nbsp;need&nbsp;an&nbsp;argument?&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(oli[1]&nbsp;!=&nbsp;':')&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;don't&nbsp;need&nbsp;argument&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optarg&nbsp;=&nbsp;NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*place&nbsp;==&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++optind;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Option-argument&nbsp;is&nbsp;either&nbsp;the&nbsp;rest&nbsp;of&nbsp;this&nbsp;argument&nbsp;or&nbsp;the<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entire&nbsp;next&nbsp;argument.&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*place)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optarg&nbsp;=&nbsp;place;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;&gt;&nbsp;++optind)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optarg&nbsp;=&nbsp;argv[optind];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;option-argument&nbsp;absent&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;=&nbsp;EMSG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*optstring&nbsp;==&nbsp;':')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(BADARG);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(opterr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">void</span>)fprintf(stderr,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"option&nbsp;requires&nbsp;an&nbsp;argument&nbsp;--&nbsp;%c\n",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optopt);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(BADCH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place&nbsp;=&nbsp;EMSG;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++optind;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(optopt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;return&nbsp;option&nbsp;letter&nbsp;</span><span style="color: #008000; ">*/</span><br />
}</div>
<br />
gnu getopt的使用:<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">main.c</span><span style="color: #008000; "><br />
</span>#include&lt;stdio.h&gt;<br />
#ifdef&nbsp;WIN32<br />
&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;"getopt.h"<br />
<span style="color: #0000FF; ">#else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;#include&lt;unistd.h&gt;<br />
<span style="color: #0000FF; ">#endif</span><br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;**argv)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ch;<br />
&nbsp;&nbsp;&nbsp;&nbsp;opterr&nbsp;=&nbsp;1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>((ch&nbsp;=&nbsp;getopt(argc,argv,"a:bcde"))!=&nbsp;-1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>(ch)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;'a':&nbsp;printf("option&nbsp;a:'%s'\n",optarg);&nbsp;<span style="color: #0000FF; ">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;'b':&nbsp;printf("option&nbsp;b&nbsp;:b\n");&nbsp;<span style="color: #0000FF; ">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:&nbsp;&nbsp;printf("other&nbsp;option&nbsp;:%c\n",ch);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("optopt&nbsp;+%c\n",optopt);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">system("pause");</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
<br />
}</div><img src ="http://www.cppblog.com/aaxron/aggbug/199482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-04-16 15:24 <a href="http://www.cppblog.com/aaxron/archive/2013/04/16/199482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 信号signal处理机制(1)</title><link>http://www.cppblog.com/aaxron/archive/2013/04/15/199448.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 15 Apr 2013 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/04/15/199448.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/199448.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/04/15/199448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/199448.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/199448.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;signal.h&gt;&nbsp;<br />#include&nbsp;&lt;unistd.h&gt;&nbsp;<br />#include&nbsp;&lt;stdio.h&gt;&nbsp;<br /><span style="color: #0000FF; ">void</span>&nbsp;sigroutine(<span style="color: #0000FF; ">int</span>&nbsp;dunno)&nbsp;<br />{&nbsp;<br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">信号处理例程，其中dunno将会得到信号的值&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br /><span style="color: #0000FF; ">switch</span>&nbsp;(dunno)&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;1:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGHUP&nbsp;\r\n");&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;2:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGINT&nbsp;\r\n");&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;3:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGQUIT&nbsp;\r\n");&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;&nbsp;<br />}&nbsp;<br /><span style="color: #0000FF; ">return</span>;&nbsp;<br />}&nbsp;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("process&nbsp;id&nbsp;is&nbsp;%d&nbsp;\r\n",getpid());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGHUP,&nbsp;sigroutine);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">*&nbsp;下面设置三个信号的处理方法&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGINT,&nbsp;sigroutine);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGQUIT,&nbsp;sigroutine);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;;)&nbsp;;&nbsp;<br />}<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />#&nbsp;/sb3000t/enroll/sig_demo&nbsp;&amp;<br />933<br />#&nbsp;process&nbsp;id&nbsp;is&nbsp;933&nbsp;<br /><br />#&nbsp;kill&nbsp;-2&nbsp;933<br />#&nbsp;Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGINT&nbsp;<br /><br />#&nbsp;Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGINT&nbsp;<br />#&nbsp;kill&nbsp;-1&nbsp;933<br />#&nbsp;Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGHUP&nbsp;<br /><br />#&nbsp;<br />#&nbsp;kill&nbsp;-3&nbsp;933<br />#&nbsp;Get&nbsp;a&nbsp;signal&nbsp;--&nbsp;SIGQUIT&nbsp;<br /><br /></span><span style="color: #008000; ">*/</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/199448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-04-15 10:43 <a href="http://www.cppblog.com/aaxron/archive/2013/04/15/199448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crc32 For Linux 存档</title><link>http://www.cppblog.com/aaxron/archive/2013/03/25/198800.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 25 Mar 2013 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/25/198800.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198800.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/25/198800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198800.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198800.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">//编译:/usr/local/arm/4.3.1/bin/arm-linux-g++<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;sys/time.h&gt;<br /><br /><br />typedef&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;DWORD;<br />typedef&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;BYTE;<br /><br />unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;GetTickCount(<span style="color: #0000FF; ">void</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;timeval&nbsp;tv;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(gettimeofday(&amp;tv,&nbsp;NULL)!=0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(tv.tv_sec&nbsp;*&nbsp;1000&nbsp;+&nbsp;tv.tv_usec&nbsp;/&nbsp;1000);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;PrintCrcTable()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Poly&nbsp;=&nbsp;0xedb88320&nbsp;WinRAR&nbsp;Poly</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;Val;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(DWORD&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;256;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Val&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(DWORD&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;&lt;&nbsp;8;&nbsp;k++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(Val&nbsp;&amp;&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Val&nbsp;=&nbsp;0xedb88320L&nbsp;^&nbsp;(Val&nbsp;&gt;&gt;&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Val&nbsp;=&nbsp;Val&nbsp;&gt;&gt;&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("0x%08x,&nbsp;",&nbsp;Val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;==&nbsp;((i+1)%6))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><br /><span style="color: #0000FF; ">const</span>&nbsp;DWORD&nbsp;Crc32Table[]&nbsp;=<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;0x00000000,&nbsp;0x77073096,&nbsp;0xee0e612c,&nbsp;0x990951ba,&nbsp;0x076dc419,&nbsp;0x706af48f,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xe963a535,&nbsp;0x9e6495a3,&nbsp;0x0edb8832,&nbsp;0x79dcb8a4,&nbsp;0xe0d5e91e,&nbsp;0x97d2d988,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09b64c2b,&nbsp;0x7eb17cbd,&nbsp;0xe7b82d07,&nbsp;0x90bf1d91,&nbsp;0x1db71064,&nbsp;0x6ab020f2,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xf3b97148,&nbsp;0x84be41de,&nbsp;0x1adad47d,&nbsp;0x6ddde4eb,&nbsp;0xf4d4b551,&nbsp;0x83d385c7,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x136c9856,&nbsp;0x646ba8c0,&nbsp;0xfd62f97a,&nbsp;0x8a65c9ec,&nbsp;0x14015c4f,&nbsp;0x63066cd9,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xfa0f3d63,&nbsp;0x8d080df5,&nbsp;0x3b6e20c8,&nbsp;0x4c69105e,&nbsp;0xd56041e4,&nbsp;0xa2677172,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x3c03e4d1,&nbsp;0x4b04d447,&nbsp;0xd20d85fd,&nbsp;0xa50ab56b,&nbsp;0x35b5a8fa,&nbsp;0x42b2986c,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xdbbbc9d6,&nbsp;0xacbcf940,&nbsp;0x32d86ce3,&nbsp;0x45df5c75,&nbsp;0xdcd60dcf,&nbsp;0xabd13d59,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x26d930ac,&nbsp;0x51de003a,&nbsp;0xc8d75180,&nbsp;0xbfd06116,&nbsp;0x21b4f4b5,&nbsp;0x56b3c423,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xcfba9599,&nbsp;0xb8bda50f,&nbsp;0x2802b89e,&nbsp;0x5f058808,&nbsp;0xc60cd9b2,&nbsp;0xb10be924,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x2f6f7c87,&nbsp;0x58684c11,&nbsp;0xc1611dab,&nbsp;0xb6662d3d,&nbsp;0x76dc4190,&nbsp;0x01db7106,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x98d220bc,&nbsp;0xefd5102a,&nbsp;0x71b18589,&nbsp;0x06b6b51f,&nbsp;0x9fbfe4a5,&nbsp;0xe8b8d433,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x7807c9a2,&nbsp;0x0f00f934,&nbsp;0x9609a88e,&nbsp;0xe10e9818,&nbsp;0x7f6a0dbb,&nbsp;0x086d3d2d,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x91646c97,&nbsp;0xe6635c01,&nbsp;0x6b6b51f4,&nbsp;0x1c6c6162,&nbsp;0x856530d8,&nbsp;0xf262004e,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x6c0695ed,&nbsp;0x1b01a57b,&nbsp;0x8208f4c1,&nbsp;0xf50fc457,&nbsp;0x65b0d9c6,&nbsp;0x12b7e950,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x8bbeb8ea,&nbsp;0xfcb9887c,&nbsp;0x62dd1ddf,&nbsp;0x15da2d49,&nbsp;0x8cd37cf3,&nbsp;0xfbd44c65,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x4db26158,&nbsp;0x3ab551ce,&nbsp;0xa3bc0074,&nbsp;0xd4bb30e2,&nbsp;0x4adfa541,&nbsp;0x3dd895d7,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xa4d1c46d,&nbsp;0xd3d6f4fb,&nbsp;0x4369e96a,&nbsp;0x346ed9fc,&nbsp;0xad678846,&nbsp;0xda60b8d0,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x44042d73,&nbsp;0x33031de5,&nbsp;0xaa0a4c5f,&nbsp;0xdd0d7cc9,&nbsp;0x5005713c,&nbsp;0x270241aa,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xbe0b1010,&nbsp;0xc90c2086,&nbsp;0x5768b525,&nbsp;0x206f85b3,&nbsp;0xb966d409,&nbsp;0xce61e49f,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x5edef90e,&nbsp;0x29d9c998,&nbsp;0xb0d09822,&nbsp;0xc7d7a8b4,&nbsp;0x59b33d17,&nbsp;0x2eb40d81,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xb7bd5c3b,&nbsp;0xc0ba6cad,&nbsp;0xedb88320,&nbsp;0x9abfb3b6,&nbsp;0x03b6e20c,&nbsp;0x74b1d29a,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xead54739,&nbsp;0x9dd277af,&nbsp;0x04db2615,&nbsp;0x73dc1683,&nbsp;0xe3630b12,&nbsp;0x94643b84,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x0d6d6a3e,&nbsp;0x7a6a5aa8,&nbsp;0xe40ecf0b,&nbsp;0x9309ff9d,&nbsp;0x0a00ae27,&nbsp;0x7d079eb1,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xf00f9344,&nbsp;0x8708a3d2,&nbsp;0x1e01f268,&nbsp;0x6906c2fe,&nbsp;0xf762575d,&nbsp;0x806567cb,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x196c3671,&nbsp;0x6e6b06e7,&nbsp;0xfed41b76,&nbsp;0x89d32be0,&nbsp;0x10da7a5a,&nbsp;0x67dd4acc,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xf9b9df6f,&nbsp;0x8ebeeff9,&nbsp;0x17b7be43,&nbsp;0x60b08ed5,&nbsp;0xd6d6a3e8,&nbsp;0xa1d1937e,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x38d8c2c4,&nbsp;0x4fdff252,&nbsp;0xd1bb67f1,&nbsp;0xa6bc5767,&nbsp;0x3fb506dd,&nbsp;0x48b2364b,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xd80d2bda,&nbsp;0xaf0a1b4c,&nbsp;0x36034af6,&nbsp;0x41047a60,&nbsp;0xdf60efc3,&nbsp;0xa867df55,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x316e8eef,&nbsp;0x4669be79,&nbsp;0xcb61b38c,&nbsp;0xbc66831a,&nbsp;0x256fd2a0,&nbsp;0x5268e236,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xcc0c7795,&nbsp;0xbb0b4703,&nbsp;0x220216b9,&nbsp;0x5505262f,&nbsp;0xc5ba3bbe,&nbsp;0xb2bd0b28,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x2bb45a92,&nbsp;0x5cb36a04,&nbsp;0xc2d7ffa7,&nbsp;0xb5d0cf31,&nbsp;0x2cd99e8b,&nbsp;0x5bdeae1d,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x9b64c2b0,&nbsp;0xec63f226,&nbsp;0x756aa39c,&nbsp;0x026d930a,&nbsp;0x9c0906a9,&nbsp;0xeb0e363f,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x72076785,&nbsp;0x05005713,&nbsp;0x95bf4a82,&nbsp;0xe2b87a14,&nbsp;0x7bb12bae,&nbsp;0x0cb61b38,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x92d28e9b,&nbsp;0xe5d5be0d,&nbsp;0x7cdcefb7,&nbsp;0x0bdbdf21,&nbsp;0x86d3d2d4,&nbsp;0xf1d4e242,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x68ddb3f8,&nbsp;0x1fda836e,&nbsp;0x81be16cd,&nbsp;0xf6b9265b,&nbsp;0x6fb077e1,&nbsp;0x18b74777,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x88085ae6,&nbsp;0xff0f6a70,&nbsp;0x66063bca,&nbsp;0x11010b5c,&nbsp;0x8f659eff,&nbsp;0xf862ae69,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x616bffd3,&nbsp;0x166ccf45,&nbsp;0xa00ae278,&nbsp;0xd70dd2ee,&nbsp;0x4e048354,&nbsp;0x3903b3c2,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xa7672661,&nbsp;0xd06016f7,&nbsp;0x4969474d,&nbsp;0x3e6e77db,&nbsp;0xaed16a4a,&nbsp;0xd9d65adc,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x40df0b66,&nbsp;0x37d83bf0,&nbsp;0xa9bcae53,&nbsp;0xdebb9ec5,&nbsp;0x47b2cf7f,&nbsp;0x30b5ffe9,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xbdbdf21c,&nbsp;0xcabac28a,&nbsp;0x53b39330,&nbsp;0x24b4a3a6,&nbsp;0xbad03605,&nbsp;0xcdd70693,<br />&nbsp;&nbsp;&nbsp;&nbsp;0x54de5729,&nbsp;0x23d967bf,&nbsp;0xb3667a2e,&nbsp;0xc4614ab8,&nbsp;0x5d681b02,&nbsp;0x2a6f2b94,<br />&nbsp;&nbsp;&nbsp;&nbsp;0xb40bbe37,&nbsp;0xc30c8ea1,&nbsp;0x5a05df1b,&nbsp;0x2d02ef8d<br />};<br /><br />DWORD&nbsp;GenerateCrc32(DWORD&nbsp;PartialCrc,BYTE*&nbsp;Buffer,DWORD&nbsp;Length)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;crc;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Generate&nbsp;the&nbsp;CRC32&nbsp;checksum.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;=&nbsp;PartialCrc&nbsp;^&nbsp;0xffffffffL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;Length;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;=&nbsp;Crc32Table[(crc&nbsp;^&nbsp;Buffer[i])&nbsp;&amp;&nbsp;0xff]&nbsp;^&nbsp;(crc&nbsp;&gt;&gt;&nbsp;8);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(crc&nbsp;^&nbsp;0xffffffffL);<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">测试程序</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;szFileName&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&lt;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Usage:%s&nbsp;&lt;filename&gt;&nbsp;\r\n",argv[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;szFileName&nbsp;=&nbsp;argv[1];<br />&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;*fp&nbsp;=&nbsp;fopen(szFileName,"rb");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(NULL&nbsp;==&nbsp;fp)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Open&nbsp;%s&nbsp;error:%d&nbsp;\r\n",szFileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwStartTime&nbsp;=&nbsp;GetTickCount();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("dwStartTime:%u&nbsp;\r\n",dwStartTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;crc32&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;c&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(1&nbsp;==&nbsp;fread(&amp;c,1,1,fp))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc32&nbsp;=&nbsp;GenerateCrc32(crc32,&amp;c,1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwEndTime&nbsp;=&nbsp;GetTickCount();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("dwEndTime:%u&nbsp;\r\n",dwEndTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("calc_crc32(%s)&nbsp;=&nbsp;0x%08X&nbsp;,elapsed&nbsp;%u&nbsp;(ms)&nbsp;\r\n",szFileName,crc32,dwEndTime&nbsp;-&nbsp;dwStartTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/198800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-25 11:49 <a href="http://www.cppblog.com/aaxron/archive/2013/03/25/198800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用volatile实现状态机的一点想法</title><link>http://www.cppblog.com/aaxron/archive/2013/02/26/198086.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 26 Feb 2013 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/02/26/198086.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198086.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/02/26/198086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198086.html</trackback:ping><description><![CDATA[<p><br />线程A:运行在主界面,可以进入管理界面,进行日常的操作,<br />比如说登记用户,导入导出用户,产生验证记录!恢复出厂设置!</p>
<p>线程B:运行一个socket客户端任务,<br />1.将A线程产生的数据上传至服务器!<br />2.接受并处理来自服务端的命令/请求!,如,设置用户,清除数据,清除验证记录等.</p>
<p>典型的思路,在处理用户数据的时候,就用Mutex锁就可以!</p>
<p>在这里尝试用两个volatile变量处理,处理各种状态机!</p>
<p>volatile bool bDeviceBusy = false; //设备是否忙!<br />volatile bool bInManagerMenu = false; //是否在管理菜单中</p>
<p>void SetDeviceBusy(bool bBusy);<br />void SetInManagerMenu(bool bBusy);</p>
<p>场景1:<br />1.线程B如要设置用户数据,可以先锁定设备SetDeviceBusy(true),视情况可考虑并sleep(n)一下.<br />2.线程A在主界面的循环中,判断bDeviceBusy的值,如果为true,则在主界面上显示"工作中...",并且锁定设备,不能进入其他任何操作!<br />3.线程B设置用户数据完成之后,调用SetDeviceBusy(false),<br />4.线程A在主界面的循环中,判断bDeviceBusy的值,如果为false,解锁设备,使设备正常工作!</p>
<p>场景2:<br />1.线程A进入了管理菜单,进行用户数据的设置,如,恢复出厂设置时,可以先SetInManagerMenu(true)<br />2.线程B在线程的循环中,判断bInManagerMenu的值,如果为true,则不处理大部分的事务,如果有网络命令,直接应答设备忙.<br />3.线程A操作完成之后,调用SetInManagerMenu(false),<br />4.线程B在线程的循环中,判断bInManagerMenu的值,如果为false,继续处理来自服务端的命令/请求!</p>
<p><br />优化方案:<br />通过一个变量的状态来实现.<br />//volatile int device_status = -1;<br /></p><img src ="http://www.cppblog.com/aaxron/aggbug/198086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-02-26 17:03 <a href="http://www.cppblog.com/aaxron/archive/2013/02/26/198086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>loop cp 代码</title><link>http://www.cppblog.com/aaxron/archive/2012/12/06/196036.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 06 Dec 2012 06:37:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/12/06/196036.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/196036.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/12/06/196036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/196036.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/196036.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">测试工具</span><span style="color: #008000"><br /></span><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">unistd.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">cstring</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">cstdlib</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">socket.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">netinet</span><span style="color: #000000">/</span><span style="color: #000000">tcp.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">ioctl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">netinet</span><span style="color: #000000">/</span><span style="color: #0000ff">in</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">arpa</span><span style="color: #000000">/</span><span style="color: #000000">inet.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">dirent.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">time.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">assert.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">errno.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">types.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">stat.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fcntl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">assert.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Path_AddSlash(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pszPath)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(pszPath</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br />#ifdef&nbsp;WIN32<br />&nbsp;&nbsp;&nbsp;&nbsp;PathAddBackslash(pszPath);<br /></span><span style="color: #0000ff">#else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nLen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strlen(pszPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pszPath[nLen</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">!=</span><span style="color: #000000">'</span><span style="color: #000000">/</span><span style="color: #000000">'</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pszPath[nLen]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">/</span><span style="color: #000000">'</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pszPath[nLen</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\0</span><span style="color: #000000">'</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br />}<br /><br /><br />#ifndef&nbsp;WIN32<br />unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetTickCount()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;timeval&nbsp;tv;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(gettimeofday(</span><span style="color: #000000">&amp;</span><span style="color: #000000">tv,&nbsp;NULL)</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(tv.tv_sec&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">(tv.tv_usec</span><span style="color: #000000">/</span><span style="color: #000000">1000</span><span style="color: #000000">);&nbsp;<br />}<br /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Path_GetBaseName(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;strPath)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pszPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strPath.c_str();<br />#ifdef&nbsp;WIN32<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;name[</span><span style="color: #000000">256</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ext[</span><span style="color: #000000">256</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;_splitpath(pszPath,NULL,NULL,name,ext);<br />&nbsp;&nbsp;&nbsp;&nbsp;strcat(name,ext);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">(name);<br /></span><span style="color: #0000ff">#else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">(basename(pszPath));<br /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;目录是否存在</span><span style="color: #008000"><br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsDirectory(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p_dir)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;dir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;opendir(p_dir);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;NULL&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;dir&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closedir(dir);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;GetLocalFileSize(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;szFileName)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;stat&nbsp;f_stat;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(stat(szFileName,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">f_stat)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">long</span><span style="color: #000000">)f_stat.st_size;<br />}<br /><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;szCmd[</span><span style="color: #000000">512</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;szDstFileName[</span><span style="color: #000000">256</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;szDir[</span><span style="color: #000000">256</span><span style="color: #000000">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(argc</span><span style="color: #000000">!=</span><span style="color: #000000">5</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Usage:%s&nbsp;&lt;filename&gt;&nbsp;&lt;dirpath&gt;&nbsp;&lt;begin&gt;&nbsp;&lt;end&gt;&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,argv[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">255</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pszFileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;argv[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nBegin&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;atoi(argv[</span><span style="color: #000000">3</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nEnd&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;atoi(argv[</span><span style="color: #000000">4</span><span style="color: #000000">]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(szDir,argv[</span><span style="color: #000000">2</span><span style="color: #000000">]);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(GetLocalFileSize(pszFileName)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">error:&lt;%s&gt;&nbsp;is&nbsp;not&nbsp;exist&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,pszFileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">255</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">IsDirectory(szDir))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">error:&lt;%s&gt;&nbsp;is&nbsp;not&nbsp;directory&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,szDir);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">255</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;dwBeginTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetTickCount();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Path_AddSlash(szDir);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pszExtName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strchr(pszFileName,</span><span style="color: #000000">'</span><span style="color: #000000">.</span><span style="color: #000000">'</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pszExtName</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pszExtName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">""</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i</span><span style="color: #000000">=</span><span style="color: #000000">nBegin;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">nEnd;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szCmd,</span><span style="color: #000000">"</span><span style="color: #000000">cp&nbsp;%s&nbsp;%s%06d%s</span><span style="color: #000000">"</span><span style="color: #000000">,pszFileName,szDir,i,pszExtName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts(szCmd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;system(szCmd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ret</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;dwEndTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetTickCount();<br />&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">\r\n-------------------------------------------------------------------</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">from:%d,to:%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,nBegin,nEnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">begin&nbsp;time:%u,end&nbsp;time:%u&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,dwBeginTime,dwEndTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">elapse&nbsp;ms:%u&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,dwEndTime&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;dwBeginTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/196036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-12-06 14:37 <a href="http://www.cppblog.com/aaxron/archive/2012/12/06/196036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux pexec函数</title><link>http://www.cppblog.com/aaxron/archive/2012/08/10/186800.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 10 Aug 2012 01:23:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/08/10/186800.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/186800.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/08/10/186800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/186800.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/186800.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">mman.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">fcntl.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">wait.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pexec(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;command,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;result)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pid;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fds[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;status&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(pipe(fds)&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(&nbsp;(pid</span><span style="color: #000000; ">=</span><span style="color: #000000; ">vfork())&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fds[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fds[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pid&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dup2(fds[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fds[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fds[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execl(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/bin/sh</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sh</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-c</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;command,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_exit(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;waitpid(pid,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">status,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fds[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(WIFEXITED(status)</span><span style="color: #000000; ">==</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fds[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WEXITSTATUS(status);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(result</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;status;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("pid(%d)&nbsp;exited,status:%d&nbsp;\r\n",pid,status);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;fds[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(argc</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Usage:%s&nbsp;&lt;cmd&gt;&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,argv[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;status&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pexec(argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">status);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(fd</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pexec(%s)&nbsp;error&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buf[</span><span style="color: #000000; ">4097</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;readed&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(&nbsp;(readed&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;read(fd,buf,</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">))</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[readed]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">readed:%d\r\n%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,readed,buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/186800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-08-10 09:23 <a href="http://www.cppblog.com/aaxron/archive/2012/08/10/186800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pipe、dup、dup2、wait、waitpid、fork函数说明</title><link>http://www.cppblog.com/aaxron/archive/2012/08/09/186738.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 09 Aug 2012 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/08/09/186738.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/186738.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/08/09/186738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/186738.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/186738.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">pipe、dup、dup2、wait、waitpid、fork函数说明<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pipe(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]);<br />功能：创建一个简单的管道，若成功则为数组fd分配两个文件描述符，其中fd[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;用于读取管道，fd[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]用于写入管道。<br />返回：成功返回0，失败返回</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">；<br /><br />管道是Linux&nbsp;支持的最初Unix&nbsp;IPC形式之一，具有以下特点：<br />管道是半双工的，数据只能向一个方向流动；需要双方通信时，需要建立起两个管道；&nbsp;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)；&nbsp;单独构成一种独立的文件系统：管道对于管道两端的进程而言，就是一个文件，但它不是普通的文件，它不属于某种文件系统，而是自立门户，单独构成一种文件系&nbsp;统，并且只存在与内存中。&nbsp;数据的读出和写入：一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾，并且每次都是从缓冲区的头部读出数据。<br /><br />但值得我们注意的是：管道它有自身的特点。<br />&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)管道通信是单向的，并且遵守先进先出的原则，即先写入的数据先读出。<br />&nbsp;(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)管道是一个无结构，无固定大小的字节流。<br />&nbsp;(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">)两个返回的文件描述符以一种特殊的方式连接起来.写到fd[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]的数据都可以从fd[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]中读回来.<br /><br />向管道中写入数据时，linux将不保证写入的原子性，管道缓冲区一有空闲区域，写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据，那么写操作将一直阻塞。<br /><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;dup(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd)&nbsp;<br />复制一个存在的文件描述符，返回当前可用的最小文件描述符。。。比如当前文件描述符已经到了100，使用&nbsp;dup(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">)　，将返回&nbsp;</span><span style="color: #000000; ">101</span><span style="color: #000000; ">&nbsp;，101这个文件描述符拥有100的所有东西，复制了嘛。。。<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;dup2(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd2)<br />是可以指定一个文件描述符(fd2)来使用，如果fd2已经打开，则会先将其关闭，如果&nbsp;fd</span><span style="color: #000000; ">==</span><span style="color: #000000; ">fd2&nbsp;，直接返回&nbsp;fd2&nbsp;且不关闭。<br />实际上&nbsp;fcntl&nbsp;也能完成这2个函数的功能，只是对于&nbsp;dup2&nbsp;来说，fcntl&nbsp;是调用2个函数，而&nbsp;dup2&nbsp;是一个原子操作。<br /><br /><br />dup函数的作用：复制一个现有的句柄，产生一个与&#8220;源句柄特性&#8221;完全一样的新句柄(也即生成一个新的句柄号，并关联到同一个设备)<br /><br />dup2函数的作用：复制一个现有的句柄到另一个句柄上，目标句柄的特性与&#8220;源句柄特性&#8221;完全一样(也即首先关闭目标句柄，与设备断连，接着从源句柄完全拷贝复制到目标句柄)<br /><br /><br />wait和waitpid函数<br />头文件<br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">wait.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />函数&nbsp;pid_t&nbsp;wait&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;status);<br />进程一旦调用了&nbsp;wait，就&nbsp;立即阻塞自己，由wait自动分析是否当前进程的某个子进程已经退出，如果让它找到了这样一个已经变成僵尸的子进程，wait&nbsp;就会收集这个子进程的信息，&nbsp;并把它彻底销毁后返回；如果没有找到这样一个子进程，wait就会一直阻塞在这里，直到有一个出现为止。&nbsp;<br />wait(等待子进程中断或结束)<br /><br />wait()会暂时停止目前进程的执行，直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束，则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status&nbsp;返回，而子进程的进程识别码也会一快返回。如果不在意结束状态值，则参数status&nbsp;可以设成NULL。子进程的结束状态值请参考waitpid()。<br />返回值<br />如果执行成功则返回子进程识别码(PID)，如果有错误发生则返回</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">。失败原因存于errno&nbsp;中。<br /><br /><br />waitpid(等待子进程中断或结束)<br />相关函数&nbsp;wait，fork<br />表头文件<br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">wait.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />定义函数&nbsp;pid_t&nbsp;waitpid(pid_t&nbsp;pid,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;status,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;options);<br />函数说明<br />waitpid()会暂时停止目前进程的执行，直到有信号来到或子进程结束。如果在调用waitpid()时子进程已经结束，则waitpid()会立即返回子进程结束状态值。子进程的结束状态值会由参数status&nbsp;返回，而子进程的进程识别码也会一快返回。如果不在意结束状态值，则参数status&nbsp;可以设成NULL。<br /><br />参数pid&nbsp;为欲等待的子进程识别码，其他数值意义如下：<br />pid</span><span style="color: #000000; ">&lt;-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;等待进程组识别码为pid&nbsp;绝对值的任何子进程。<br />pid</span><span style="color: #000000; ">=-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;等待任何子进程，相当于wait()。<br />pid</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;等待进程组识别码与目前进程相同的任何子进程。<br />pid</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;等待任何子进程识别码为pid&nbsp;的子进程。<br /><br /><br />目前在Linux中只支持WNOHANG和WUNTRACED两个选项，<br />WNOHANG&nbsp;如果没有任何已经结束的子进程则马上返回，不予以等待。<br />WUNTRACED&nbsp;如果子进程进入暂停执行情况则马上返回，但结束状态不予以理会。<br /><br />如果我们不想使用它们，也可以把options设为0，如：<br />ret</span><span style="color: #000000; ">=</span><span style="color: #000000; ">waitpid(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,NULL,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /><br />如果使用了WNOHANG参数调用waitpid，即使没有子进程退出，它也会立即返回，不会像wait那样永远等下去。<br /><br />而WUNTRACED参数，用于跟踪调试，极少用到，就不说了。<br />查看linux源代码&nbsp;unistd.h&nbsp;我们会发现，其实&nbsp;wait&nbsp;就是经过包装的&nbsp;waitpid:<br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;inline&nbsp;pid_t&nbsp;wait(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;wait_stat)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;waitpid(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,wait_stat,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />}<br /><br />可以用kill函数杀死子进程<br />kill(childPid,SIGKILL);<br /><br /><br />子进程的结束状态返回后存于status，下面有几个宏可判别结束情况：<br />WIFEXITED(status)如果子进程正常结束则为非0值。<br />WEXITSTATUS(status)取得子进程exit()返回的结束代码，一般会先用WIFEXITED&nbsp;来判断是否正常结束才能使用此宏。<br />WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真<br />WTERMSIG(status)&nbsp;取得子进程因信号而中止的信号代码，一般会先用WIFSIGNALED&nbsp;来判断后才使用此宏。<br />WIFSTOPPED(status)&nbsp;如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED&nbsp;时才会有此情况。<br />WSTOPSIG(status)&nbsp;取得引发子进程暂停的信号代码，一般会先用WIFSTOPPED&nbsp;来判断后才使用此宏。<br /><br /></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(WIFEXITED(status))&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">exited,&nbsp;status=%d/n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WEXITSTATUS(status));<br />}&nbsp;<br /></span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(WIFSIGNALED(status))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">killed&nbsp;by&nbsp;signal&nbsp;%d/n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WTERMSIG(status));<br />}&nbsp;<br /></span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(WIFSTOPPED(status))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">stopped&nbsp;by&nbsp;signal&nbsp;%d/n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;WSTOPSIG(status));<br />}&nbsp;<br /></span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(WIFCONTINUED(status))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">continued/n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />}<br /><br />返回值<br />如果执行成功则返回子进程识别码(PID)，如果有错误发生则返回</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">。失败原因存于errno&nbsp;中。<br /><br /><br />fork函数<br />Create&nbsp;a&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;process<br /><br />程序段里用了fork();之后程序出了分岔，派生出了两个进程。具体哪个先运行就看该操作的系统的调度算法了。<br />函数返回2次.<br />返回值得在子进程中pid的值为0，通过getpid可以获取子进程的进程id；<br /><br />返回值:<br />A&nbsp;value&nbsp;of&nbsp;zero&nbsp;to&nbsp;the&nbsp;child&nbsp;process;&nbsp;and&nbsp;the&nbsp;process&nbsp;ID&nbsp;of&nbsp;the&nbsp;child&nbsp;process&nbsp;to&nbsp;the&nbsp;parent&nbsp;process.&nbsp;<br />Both&nbsp;processes&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">&nbsp;to&nbsp;execute&nbsp;from&nbsp;the&nbsp;fork()&nbsp;function.&nbsp;If&nbsp;an&nbsp;error&nbsp;occurs,&nbsp;fork()&nbsp;returns&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;to&nbsp;the&nbsp;parent&nbsp;and&nbsp;sets&nbsp;errno.<br /><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">process.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;1&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;pid</span><span style="color: #000000; ">=</span><span style="color: #000000; ">fork();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pid&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;in&nbsp;fork!&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pid&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">i&nbsp;am&nbsp;the&nbsp;child&nbsp;process,&nbsp;my&nbsp;process&nbsp;id&nbsp;is&nbsp;%d&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,getpid());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">i&nbsp;am&nbsp;the&nbsp;parent&nbsp;process,&nbsp;my&nbsp;process&nbsp;id&nbsp;is&nbsp;%d&nbsp;\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,getpid());&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;2&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/186738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-08-09 14:36 <a href="http://www.cppblog.com/aaxron/archive/2012/08/09/186738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>execl函数 &amp;&amp; vfork()</title><link>http://www.cppblog.com/aaxron/archive/2012/07/05/181444.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 05 Jul 2012 01:41:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/07/05/181444.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/181444.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/07/05/181444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/181444.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/181444.html</trackback:ping><description><![CDATA[<div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">execl函数&nbsp;&amp;&amp;&nbsp;vfork()</span><span style="color: #008000; "><br /></span><br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;sys/types.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />main()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pid;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>((pid=vfork())&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">(0)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execl("/bin/ls",&nbsp;"ls",&nbsp;"-al",&nbsp;"/etc/passwd",&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)0);<span style="color: #008000; ">//</span><span style="color: #008000; ">(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">char&nbsp;*&nbsp;argv[]&nbsp;=&nbsp;{"ls",&nbsp;"-al",&nbsp;"/etc/passwd",&nbsp;0};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">execvp("ls",&nbsp;argv);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">(2)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(pid&nbsp;&gt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("I'm&nbsp;a&nbsp;parent!\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />---------------------------------------------------<br />(0)&nbsp;vfork()和execl()配套使用可以提高效率(必须配套使用)<br />(1)&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;execvp(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*file,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*<span style="color: #0000FF; ">const</span>&nbsp;argv[]);<br />&nbsp;&nbsp;&nbsp;函数execvp()应该先构造一个指向各参数的指针数组，然后将该数组地址作为参数<br />(2)&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;execl(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*path,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*arg,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);<br />&nbsp;&nbsp;&nbsp;函数execl()要求将新程序的每个命令行参数都说明成一个单独的参数，这种参数表以空指针结尾<br />(3)vfork创建的子进程后，父进程会被阻塞，直到子进程执行execl和exit<br />(4)当进程调用一种exec函数时，该进程完全由新程序代换，而新程序则从其main函数开始执行。因为调用exec并不创建新进程，所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。<br />(5)当前进程的正文都被替换了，那么execl后的语句，即便execl退出了，都不会被执行。<br />(6)execl成功则不返回值，&nbsp;失败返回-1，&nbsp;失败原因存于errno中<br />$&nbsp;./a.<span style="color: #0000FF; ">out</span>&nbsp;<br />-rw-r--r--&nbsp;1&nbsp;root&nbsp;root&nbsp;1448&nbsp;2007-05-16&nbsp;17:30&nbsp;/etc/passwd<br />I'm&nbsp;a&nbsp;parent!</div></div><img src ="http://www.cppblog.com/aaxron/aggbug/181444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-07-05 09:41 <a href="http://www.cppblog.com/aaxron/archive/2012/07/05/181444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]Linux ExecFun</title><link>http://www.cppblog.com/aaxron/archive/2012/07/05/181441.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 05 Jul 2012 01:30:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/07/05/181441.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/181441.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/07/05/181441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/181441.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/181441.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: red; ">//转载必须注明<br /></span><span style="color: red; ">//Aaron.xu</span><br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;time.h&gt;<br />#include&nbsp;&lt;sys/time.h&gt;<br />#include&nbsp;&lt;errno.h&gt;<br />#include&nbsp;&lt;assert.h&gt;<br />#include&nbsp;&lt;sys/types.h&gt;<br />#include&nbsp;&lt;sys/wait.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><br />unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;GetTickCount(<span style="color: #0000FF; ">void</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;timeval&nbsp;tv;<br />&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&amp;tv,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(tv.tv_sec*1000&nbsp;+&nbsp;tv.tv_usec/1000);<br />}<br /><br />typedef&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;(*ExecFunProc)(<span style="color: #0000FF; ">void</span>*&nbsp;pArg);<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;mysleep(<span style="color: #0000FF; ">void</span>*&nbsp;pArg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sleep(4);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;2;<br />}<br /><br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">返回值:&nbsp;true:执行成功&nbsp;,false:执行失败<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">参数说明:<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">pfnExec&nbsp;&nbsp;&nbsp;&nbsp;回调函数<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">pArg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回调函数的参数<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">pnStatus&nbsp;&nbsp;&nbsp;&nbsp;把pfnExec执行的返回值,返回给pnStatus指向的变量<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">dwTimeOut&nbsp;&nbsp;&nbsp;&nbsp;执行的超时时间,单位毫秒(1秒=1000毫秒)<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">bKill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;超时退出时,是否杀死子进程.true:杀死,false:不杀死</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">bool</span>&nbsp;ExecFun(ExecFunProc&nbsp;pfnExec,<span style="color: #0000FF; ">void</span>*&nbsp;pArg,<span style="color: #0000FF; ">int</span>*&nbsp;pnStatus,unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dwTimeOut,<span style="color: #0000FF; ">bool</span>&nbsp;bKill&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;childPid;<br />&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;tempPid;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nStatus&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;bRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dwEndTime&nbsp;=&nbsp;GetTickCount()&nbsp;+&nbsp;dwTimeOut;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;assert(pfnExec!=NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(pnStatus!=NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*pnStatus&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;(childPid&nbsp;=&nbsp;fork())&nbsp;&lt;&nbsp;0&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("fork&nbsp;error:%d&nbsp;\r\n",errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(childPid&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("at&nbsp;%u,child&nbsp;pid:%d&nbsp;Entry\r\n",GetTickCount(),getpid());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStatus&nbsp;=&nbsp;pfnExec(pArg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("at&nbsp;%u,child&nbsp;pid:%d&nbsp;Exit(%d)\r\n",GetTickCount(),getpid(),nStatus);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(nStatus);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usleep(50*1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempPid&nbsp;=&nbsp;waitpid(childPid,&amp;nStatus,WNOHANG);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(tempPid&lt;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("waitpid(%d)&nbsp;execption,errno:%d&nbsp;\r\n",childPid,errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(tempPid&gt;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStatus&nbsp;&nbsp;=&nbsp;WEXITSTATUS(nStatus);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("waitpid(%d)&nbsp;normal&nbsp;exit(%d)\r\n",childPid,nStatus);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*pnStatus&nbsp;=&nbsp;nStatus;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(GetTickCount()&gt;dwEndTime)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("at&nbsp;%d,waitpid(%d)&nbsp;time&nbsp;out&nbsp;exit\r\n",GetTickCount(),childPid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(bKill&nbsp;&amp;&amp;&nbsp;(kill(childPid,SIGKILL)==0))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait(&amp;nStatus);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;bRet&nbsp;=&nbsp;ExecFun(mysleep,NULL,&amp;nRet,2000,<span style="color: #0000FF; ">true</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("line:%d&nbsp;,&nbsp;bRet:%d,nRet:%d&nbsp;\r\n",__LINE__,bRet,nRet);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">puts(strerror(EINTR));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/181441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-07-05 09:30 <a href="http://www.cppblog.com/aaxron/archive/2012/07/05/181441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux kill信号列表</title><link>http://www.cppblog.com/aaxron/archive/2012/06/11/178400.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 11 Jun 2012 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/06/11/178400.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/178400.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/06/11/178400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/178400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/178400.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->kill&nbsp;-l<br />&nbsp;1)&nbsp;SIGHUP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)&nbsp;SIGINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)&nbsp;SIGQUIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)&nbsp;SIGILL<br />&nbsp;5)&nbsp;SIGTRAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6)&nbsp;SIGABRT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7)&nbsp;SIGBUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8)&nbsp;SIGFPE<br />&nbsp;9)&nbsp;SIGKILL&nbsp;&nbsp;&nbsp;&nbsp;10)&nbsp;SIGUSR1&nbsp;&nbsp;&nbsp;&nbsp;11)&nbsp;SIGSEGV&nbsp;&nbsp;&nbsp;&nbsp;12)&nbsp;SIGUSR2<br />13)&nbsp;SIGPIPE&nbsp;&nbsp;&nbsp;&nbsp;14)&nbsp;SIGALRM&nbsp;&nbsp;&nbsp;&nbsp;15)&nbsp;SIGTERM&nbsp;&nbsp;&nbsp;&nbsp;16)&nbsp;SIGSTKFLT<br />17)&nbsp;SIGCHLD&nbsp;&nbsp;&nbsp;&nbsp;18)&nbsp;SIGCONT&nbsp;&nbsp;&nbsp;&nbsp;19)&nbsp;SIGSTOP&nbsp;&nbsp;&nbsp;&nbsp;20)&nbsp;SIGTSTP<br />21)&nbsp;SIGTTIN&nbsp;&nbsp;&nbsp;&nbsp;22)&nbsp;SIGTTOU&nbsp;&nbsp;&nbsp;&nbsp;23)&nbsp;SIGURG&nbsp;&nbsp;&nbsp;&nbsp;24)&nbsp;SIGXCPU<br />25)&nbsp;SIGXFSZ&nbsp;&nbsp;&nbsp;&nbsp;26)&nbsp;SIGVTALRM&nbsp;&nbsp;&nbsp;&nbsp;27)&nbsp;SIGPROF&nbsp;&nbsp;&nbsp;&nbsp;28)&nbsp;SIGWINCH<br />29)&nbsp;SIGIO&nbsp;&nbsp;&nbsp;&nbsp;30)&nbsp;SIGPWR&nbsp;&nbsp;&nbsp;&nbsp;31)&nbsp;SIGSYS&nbsp;&nbsp;&nbsp;&nbsp;34)&nbsp;SIGRTMIN<br />35)&nbsp;SIGRTMIN+1&nbsp;&nbsp;&nbsp;&nbsp;36)&nbsp;SIGRTMIN+2&nbsp;&nbsp;&nbsp;&nbsp;37)&nbsp;SIGRTMIN+3&nbsp;&nbsp;&nbsp;&nbsp;38)&nbsp;SIGRTMIN+4<br />39)&nbsp;SIGRTMIN+5&nbsp;&nbsp;&nbsp;&nbsp;40)&nbsp;SIGRTMIN+6&nbsp;&nbsp;&nbsp;&nbsp;41)&nbsp;SIGRTMIN+7&nbsp;&nbsp;&nbsp;&nbsp;42)&nbsp;SIGRTMIN+8<br />43)&nbsp;SIGRTMIN+9&nbsp;&nbsp;&nbsp;&nbsp;44)&nbsp;SIGRTMIN+10&nbsp;&nbsp;&nbsp;&nbsp;45)&nbsp;SIGRTMIN+11&nbsp;&nbsp;&nbsp;&nbsp;46)&nbsp;SIGRTMIN+12<br />47)&nbsp;SIGRTMIN+13&nbsp;&nbsp;&nbsp;&nbsp;48)&nbsp;SIGRTMIN+14&nbsp;&nbsp;&nbsp;&nbsp;49)&nbsp;SIGRTMIN+15&nbsp;&nbsp;&nbsp;&nbsp;50)&nbsp;SIGRTMAX-14<br />51)&nbsp;SIGRTMAX-13&nbsp;&nbsp;&nbsp;&nbsp;52)&nbsp;SIGRTMAX-12&nbsp;&nbsp;&nbsp;&nbsp;53)&nbsp;SIGRTMAX-11&nbsp;&nbsp;&nbsp;&nbsp;54)&nbsp;SIGRTMAX-10<br />55)&nbsp;SIGRTMAX-9&nbsp;&nbsp;&nbsp;&nbsp;56)&nbsp;SIGRTMAX-8&nbsp;&nbsp;&nbsp;&nbsp;57)&nbsp;SIGRTMAX-7&nbsp;&nbsp;&nbsp;&nbsp;58)&nbsp;SIGRTMAX-6<br />59)&nbsp;SIGRTMAX-5&nbsp;&nbsp;&nbsp;&nbsp;60)&nbsp;SIGRTMAX-4&nbsp;&nbsp;&nbsp;&nbsp;61)&nbsp;SIGRTMAX-3&nbsp;&nbsp;&nbsp;&nbsp;62)&nbsp;SIGRTMAX-2<br />63)&nbsp;SIGRTMAX-1&nbsp;&nbsp;&nbsp;&nbsp;64)&nbsp;SIGRTMAX &nbsp; &nbsp;<br /></div>
<div></div>
<p>&nbsp;</p>
<div><br />列表中，编号为1 ~ 31的信号为传统UNIX支持的信号，是不可靠信号(非实时的)，编号为32 ~ 63的信号是后来扩充的，称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队，可能会造成信号丢失，而后者不会。</div>
<div></div>
<div>下面我们对编号小于SIGRTMIN的信号进行讨论。</div>
<div></div>
<div>1) SIGHUP</div>
<div>本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。</div>
<div></div>
<div>登录Linux时，系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序，包括前台进程组和后台进程组，一般都属于这个 Session。当用户退出Linux登录时，前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程，因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号，比如wget能捕获SIGHUP信号，并忽略它，这样就算退出了Linux登录，wget也 能继续下载。</div>
<div></div>
<div>此外，对于与终端脱离关系的守护进程，这个信号用于通知它重新读取配置文件。</div>
<div></div>
<div>2) SIGINT</div>
<div>程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出，用于通知前台进程组终止进程。</div>
<div></div>
<div>3) SIGQUIT</div>
<div>和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。</div>
<div></div>
<div>4) SIGILL</div>
<div>执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。</div>
<div></div>
<div>5) SIGTRAP</div>
<div>由断点指令或其它trap指令产生. 由debugger使用。</div>
<div></div>
<div>6) SIGABRT</div>
<div>调用abort函数生成的信号。</div>
<div></div>
<div>7) SIGBUS</div>
<div>非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。</div>
<div></div>
<div>8) SIGFPE</div>
<div>在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。</div>
<div></div>
<div>9) SIGKILL</div>
<div>用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了，可尝试发送这个信号。</div>
<div></div>
<div>10) SIGUSR1</div>
<div>留给用户使用</div>
<div></div>
<div>11) SIGSEGV</div>
<div>试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.</div>
<div></div>
<div>12) SIGUSR2</div>
<div>留给用户使用</div>
<div></div>
<div>13) SIGPIPE</div>
<div>管道破裂。这个信号通常在进程间通信产生，比如采用FIFO(管道)通信的两个进程，读管道没打开或者意外终止就往管道写，写进程会收到SIGPIPE信号。此外用Socket通信的两个进程，写进程在写Socket的时候，读进程已经终止。</div>
<div></div>
<div>14) SIGALRM</div>
<div>时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.</div>
<div></div>
<div>15) SIGTERM</div>
<div>程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出，shell命令kill缺省产生这个信号。如果进程终止不了，我们才会尝试SIGKILL。</div>
<div></div>
<div>17) SIGCHLD</div>
<div>子进程结束时, 父进程会收到这个信号。</div>
<div></div>
<div>如果父进程没有处理这个信号，也没有等待(wait)子进程，子进程虽然终止，但是还会在内核进程表中占有表项，这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号，或者捕捉它，或者wait它派生的子进程，或者父进程先终止，这时子进程的终止自动由init进程来接管)。</div>
<div></div>
<div>18) SIGCONT</div>
<div>让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符...</div>
<div></div>
<div>19) SIGSTOP</div>
<div>停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.</div>
<div></div>
<div>20) SIGTSTP</div>
<div>停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号</div>
<div></div>
<div>21) SIGTTIN</div>
<div>当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.</div>
<div></div>
<div>22) SIGTTOU</div>
<div>类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.</div>
<div></div>
<div>23) SIGURG</div>
<div>有"紧急"数据或out-of-band数据到达socket时产生.</div>
<div></div>
<div>24) SIGXCPU</div>
<div>超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。</div>
<div></div>
<div>25) SIGXFSZ</div>
<div>当进程企图扩大文件以至于超过文件大小资源限制。</div>
<div></div>
<div>26) SIGVTALRM</div>
<div>虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.</div>
<div></div>
<div>27) SIGPROF</div>
<div>类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.</div>
<div></div>
<div>28) SIGWINCH</div>
<div>窗口大小改变时发出.</div>
<div></div>
<div>29) SIGIO</div>
<div>文件描述符准备就绪, 可以开始进行输入/输出操作.</div>
<div></div>
<div>30) SIGPWR</div>
<div>Power failure</div>
<div></div>
<div>31) SIGSYS</div>
<div>非法的系统调用。</div>
<div></div>
<div>在以上列出的信号中，程序不可捕获、阻塞或忽略的信号有：SIGKILL,SIGSTOP</div>
<div>不能恢复至默认动作的信号有：SIGILL,SIGTRAP</div>
<div>默认会导致进程流产的信号有：SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ</div>
<div>默认会导致进程退出的信号有：SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM</div>
<p>&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/aaxron/linux信号1.JPG" width="791" longdesc="" height="886" /><br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/aaxron/linux信号2.JPG" width="778" longdesc="" height="322" /><br /></p><img src ="http://www.cppblog.com/aaxron/aggbug/178400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-06-11 10:18 <a href="http://www.cppblog.com/aaxron/archive/2012/06/11/178400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>popt </title><link>http://www.cppblog.com/aaxron/archive/2012/05/26/176263.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sat, 26 May 2012 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/05/26/176263.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/176263.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/05/26/176263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/176263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/176263.html</trackback:ping><description><![CDATA[<div>参考网址:<br /><br /><a class="ulink" href="http://rpm5.org/files/popt/popt-1.16.tar.gz">http://rpm5.org/files/<font style="background-color: #00ffff">popt</font>/</a><br /><br /><a href="http://www.linuxfromscratch.org/blfs/view/svn/general/popt.html">http://www.linuxfromscratch.org/blfs/view/svn/general/popt.html</a><br /><br />arm 平台编译:<br />./configure CC=arm-linux-gcc --host=arm-linux --prefix=$PWD/_install<br /><br />make&nbsp;&amp;&amp;&nbsp;make&nbsp;install&nbsp;&nbsp;<br />就可以了<br /></div><img src ="http://www.cppblog.com/aaxron/aggbug/176263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-05-26 17:58 <a href="http://www.cppblog.com/aaxron/archive/2012/05/26/176263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux常用C头文件</title><link>http://www.cppblog.com/aaxron/archive/2012/05/18/175275.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 18 May 2012 01:58:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/05/18/175275.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/175275.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/05/18/175275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/175275.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/175275.html</trackback:ping><description><![CDATA[<div><span style="font-size: 12px;">linux常用C头文件</span></div><div><span style="font-size: 12px;">aio.h 异步I/O</span></div><div><span style="font-size: 12px;">assert.h 验证程序断言&nbsp;</span></div><div><span style="font-size: 12px;">complex 复数类</span></div><div><span style="font-size: 12px;">complex.h 复数处理</span></div><div><span style="font-size: 12px;">cpio.h cpio归档值&nbsp;</span></div><div><span style="font-size: 12px;">ctype.h 字符类型&nbsp;</span></div><div><span style="font-size: 12px;">dirent.h 目录项,opendir(),closedir(),readdir(),readdir64()</span></div><div><span style="font-size: 12px;">dlfcn.h 动态链接</span></div><div><span style="font-size: 12px;">errno.h 出错码&nbsp;</span></div><div><span style="font-size: 12px;">exception 异常处理类</span></div><div><span style="font-size: 12px;">fcntl.h 文件控制&nbsp;</span></div><div><span style="font-size: 12px;">fenv.h 浮点环境</span></div><div><span style="font-size: 12px;">float.h 浮点常数&nbsp;</span></div><div><span style="font-size: 12px;">fmtmsg.h 消息显示结构</span></div><div><span style="font-size: 12px;">fnmatch.h 文件名匹配类型</span></div><div><span style="font-size: 12px;">fstream.h 文件输入／输出</span></div><div><span style="font-size: 12px;">ftw.h 文件树漫游</span></div><div><span style="font-size: 12px;">getopt.h 处理命令行参数,getopt()</span></div><div><span style="font-size: 12px;">glob.h 路径名模式匹配类型</span></div><div><span style="font-size: 12px;">grp.h 组文件</span></div><div><span style="font-size: 12px;">iconv.h 代码集转换使用程序</span></div><div><span style="font-size: 12px;">inttypes.h 整数格式转换</span></div><div><span style="font-size: 12px;">iomanip.h 参数化输入／输出</span></div><div><span style="font-size: 12px;">ios 基本输入／输出支持</span></div><div><span style="font-size: 12px;">iosfwd 输入／输出系统使用的前置声明</span></div><div><span style="font-size: 12px;">iostream.h 数据流输入／输出</span></div><div><span style="font-size: 12px;">istream 基本输入流</span></div><div><span style="font-size: 12px;">langinfo.h 语言信息常量</span></div><div><span style="font-size: 12px;">libgen.h 模式匹配函数定义</span></div><div><span style="font-size: 12px;">limits.h 定义各种数据类型最值常量</span></div><div><span style="font-size: 12px;">locale.h 定义本地化函数</span></div><div><span style="font-size: 12px;">math.h 定义数学函数</span></div><div><span style="font-size: 12px;">monetary.h 货币类型</span></div><div><span style="font-size: 12px;">mqueue.h 消息队列</span></div><div><span style="font-size: 12px;">ndbm.h 数据库操作</span></div><div><span style="font-size: 12px;">nl_types.h 消息类别</span></div><div><span style="font-size: 12px;">ostream 基本输出流</span></div><div><span style="font-size: 12px;">poll.h 轮询函数</span></div><div><span style="font-size: 12px;">pthread.h 线程</span></div><div><span style="font-size: 12px;">pwd.h 口令文件</span></div><div><span style="font-size: 12px;">regex.h 正则表达式</span></div><div><span style="font-size: 12px;">sched.h 执行调度</span></div><div><span style="font-size: 12px;">search.h 搜索表</span></div><div><span style="font-size: 12px;">semaphore.h 信号量</span></div><div><span style="font-size: 12px;">signal.h 信号&nbsp;</span></div><div><span style="font-size: 12px;">spawn.h 实时spawn接口</span></div><div><span style="font-size: 12px;">sstream 基于字符串的流</span></div><div><span style="font-size: 12px;">stdarg.h 可变参数表&nbsp;</span></div><div><span style="font-size: 12px;">stdbool.h 布尔环境</span></div><div><span style="font-size: 12px;">stddef.h 标准定义&nbsp;</span></div><div><span style="font-size: 12px;">stdexcept 标准异常类</span></div><div><span style="font-size: 12px;">stdint.h 整型环境</span></div><div><span style="font-size: 12px;">stdio.h 标准I/O库 &nbsp;standard input output header -&gt; stdio.h</span></div><div><span style="font-size: 12px;">stdlib.h 公用函数 &nbsp;standard library header -&gt; stdlib.h</span></div><div><span style="font-size: 12px;">streambuf 底层输入／输出支持</span></div><div><span style="font-size: 12px;">string.h 字符串操作</span></div><div><span style="font-size: 12px;">stropts.h XSI STREAMS接口</span></div><div><span style="font-size: 12px;">strstrea.h 基于数组的输入／输出</span></div><div><span style="font-size: 12px;">syslog.h 系统出错日志记录</span></div><div><span style="font-size: 12px;">tar.h tar归档值&nbsp;</span></div><div><span style="font-size: 12px;">termios.h 终端I/O&nbsp;</span></div><div><span style="font-size: 12px;">tgmath.h 通用类型数学宏&nbsp;</span></div><div><span style="font-size: 12px;">time.h 时间和日期&nbsp;</span></div><div><span style="font-size: 12px;">trace.h 事件跟踪</span></div><div><span style="font-size: 12px;">ucontext.h 用户上下文</span></div><div><span style="font-size: 12px;">ulimit.h 用户限制&nbsp;</span></div><div><span style="font-size: 12px;">unistd.h 符号常数 unix standard header -&gt; unistd.h</span></div><div><span style="font-size: 12px;">utime.h 文件时间&nbsp;</span></div><div><span style="font-size: 12px;">utmpx.h 用户帐户数据库</span></div><div><span style="font-size: 12px;">wchar.h 宽字符处理及输入／输出</span></div><div><span style="font-size: 12px;">wctype.h 宽字符分类</span></div><div><span style="font-size: 12px;">wordexp.h 字符扩展类型</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">linux/if.h 主要的socket头文件,包括ifreq,ifconf,ifmap</span></div><div><span style="font-size: 12px;">linux/if_packet.h 原始数据包的数据结构定义,包括sockaddr_pkt,sockaddr_ll,同理的还有if_ppp.h,if_tun.h等等</span></div><div><span style="font-size: 12px;">linux/ip.h iphdr的数据结构,以及一些ip层的数据定义,同理的还有tcp.h,udp.h等等</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">arpa/inet.h INTERNET定义</span></div><div><span style="font-size: 12px;">netdb.h hostent,gethostbyname</span></div><div><span style="font-size: 12px;">net/bpf.h berkeley的数据包过滤头文件</span></div><div><span style="font-size: 12px;">net/ethernet.h ether_addr,ether_header</span></div><div><span style="font-size: 12px;">net/if.h 套接字本地接口</span></div><div><span style="font-size: 12px;">netinet/ether.h 以太祯的网络字节和ascii字节的转换,包括ether_ntoa(),ether_aton这样的函数定义</span></div><div><span style="font-size: 12px;">netinet/if_ether.h ether_arp的数据结构</span></div><div><span style="font-size: 12px;">netinet/in.h ip,结构sockaddr_in,ntoh,hton</span></div><div><span style="font-size: 12px;">netinet/ip.h iphdr的数据结构,同时还包括了timestamp结构</span></div><div><span style="font-size: 12px;">netinet/tcp.h 传输控制协议定义</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">sys/ipc.h IPC&nbsp;</span></div><div><span style="font-size: 12px;">sys/mman.h 内存管理声明</span></div><div><span style="font-size: 12px;">sys/msg.h 消息队列&nbsp;</span></div><div><span style="font-size: 12px;">sys/select.h Select函数</span></div><div><span style="font-size: 12px;">sys/sem.h 信号量&nbsp;</span></div><div><span style="font-size: 12px;">sys/shm.h 共享存储&nbsp;</span></div><div><span style="font-size: 12px;">sys/socket.h 套接字借口</span></div><div><span style="font-size: 12px;">sys/stat.h 文件状态&nbsp;</span></div><div><span style="font-size: 12px;">sys/statvfs.h 文件系统信息</span></div><div><span style="font-size: 12px;">sys/time.h 时间类型</span></div><div><span style="font-size: 12px;">sys/timeb.h 附加的日期和时间定义</span></div><div><span style="font-size: 12px;">sys/times.h 进程时间&nbsp;</span></div><div><span style="font-size: 12px;">sys/types.h 原系统数据类型&nbsp;</span></div><div><span style="font-size: 12px;">sys/uio.h 矢量I/O操作</span></div><div><span style="font-size: 12px;">sys/un.h UNIX域套接字定义</span></div><div><span style="font-size: 12px;">sys/utsname.h 系统名</span></div><div><span style="font-size: 12px;">sys/wait.h 进程控制</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">algorithm STL通用算法</span></div><div><span style="font-size: 12px;">bitset STL位集容器</span></div><div><span style="font-size: 12px;">deque STL双端队列容器</span></div><div><span style="font-size: 12px;">functional STL定义运算函数（代替运算符）</span></div><div><span style="font-size: 12px;">list STL线性列表容器</span></div><div><span style="font-size: 12px;">map STL映射容器</span></div><div><span style="font-size: 12px;">queue STL队列容器</span></div><div><span style="font-size: 12px;">set STL集合容器</span></div><div><span style="font-size: 12px;">stack STL堆栈容器&nbsp;</span></div><div><span style="font-size: 12px;">utility STL通用模板类</span></div><div><span style="font-size: 12px;">vector STL动态数组容器</span></div><div style="font-family: Tahoma; font-size: 11px; "></div><img src ="http://www.cppblog.com/aaxron/aggbug/175275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-05-18 09:58 <a href="http://www.cppblog.com/aaxron/archive/2012/05/18/175275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不带缓存的I/O和标准I/O</title><link>http://www.cppblog.com/aaxron/archive/2012/05/10/174468.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 10 May 2012 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/05/10/174468.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/174468.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/05/10/174468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/174468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/174468.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">不带缓存的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O和标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O<br /><br />首先说说不带缓存的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O，UNIX的文件I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O&nbsp;read、write是不带缓存的。不带缓存是指每个read、write都调用内核的一个系统调用，它们是POSIX.1的组成部分。<br />二者的原型为：<br />ssize_t&nbsp;read(&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd,&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;buf,&nbsp;size_t&nbsp;nbytes&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;若成功返回读到的字节数</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">ssize_t&nbsp;write(&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;buf,&nbsp;size_t&nbsp;nbytes&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;若成功返回已写的字节数</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />注意，上面的buf不是指read、write带缓存，而是当read时用来存放读出的字节，write时存放待写的字节。对于read，nbytes表示每次最多读的字节数。但这个块的大小将影响I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O的效率，其值和具体系统有关。<br /><br />补充一下，不带缓存的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O对文件描述符操作，下面带缓存的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O是针对流的。<br /><br />标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O库就是带缓存的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O，它由ANSI&nbsp;C标准说明。当然，标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O最终都会调用上面的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O例程。标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O库代替用户处理很多细节，比如缓存分配、以优化长度执行I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O等。<br /><br />标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O提供缓存的目的就是减少调用read和write的次数，它对每个I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O流自动进行缓存管理（标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O函数通常调用malloc来分配缓存）。它提供了三种类型的缓存：<br /><br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;全缓存。当填满标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O缓存后才执行I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O操作。磁盘上的文件通常是全缓存的。<br /><br /></span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;行缓存。当输入输出遇到新行符或缓存满时，才由标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O库执行实际I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O操作。stdin、stdout通常是行缓存的。<br /><br /></span><span style="color: #000000; ">3</span><span style="color: #000000; ">)&nbsp;无缓存。相当于read、write了。stderr通常是无缓存的，因为它必须尽快输出。<br /><br />一般而言，由系统选择缓存的长度，并自动分配。标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O库在关闭流的时候自动释放缓存。<br /><br />在标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O库中，一个效率不高的不足之处是需要复制的数据量。当每次使用行函数fgets和fputs时，通常需要复制两次数据：一次是在内核和标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O缓存之间（当调用read和write时），第二次是在标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O缓存（通常系统分配和管理）和用户程序中的行缓存（fgets的参数就需要一个用户行缓存指针）之间。<br /><br />不管上面讲的到底懂没懂，记住一点：<br /><br />使用标准I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O例程的一个优点是无需考虑缓存及最佳I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O长度的选择，并且它并不比直接调用read、write慢多少。<br /><br />带缓存的文件操作是标准C&nbsp;库的实现，第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的，而是针对内存中的缓存的。何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制。不带缓存的文件操作通常都是系统提供的系统调用，更加低级，直接从硬盘中读取和写入文件，由于IO瓶颈的原因，速度并不如意，而且原子操作需要程序员自己保证，但使用得当的话效率并不差。<br />另外标准库中的带缓存文件IO&nbsp;是调用系统提供的不带缓存IO实现的。<br /><br />&#8220;术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。所有的磁盘I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O都要经过内核的块缓冲（也称内核的缓冲区高速缓存），唯一例外的是对原始磁盘设备的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O。既然read或write的数据都要被内核缓冲，那么术语&#8220;不带缓冲的I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O&#8220;指的是在用户的进程中对这两个函数不会自动缓冲，每次read或write就要进行一次系统调用。&#8220;<br /><br /></span><span style="color: #000000; ">--------</span><span style="color: #000000; ">摘自</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unix环境编程</span><span style="color: #000000; ">&gt;</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/174468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-05-10 16:53 <a href="http://www.cppblog.com/aaxron/archive/2012/05/10/174468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终级makefile</title><link>http://www.cppblog.com/aaxron/archive/2012/04/13/171250.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 13 Apr 2012 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/04/13/171250.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/171250.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/04/13/171250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/171250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/171250.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">#</span><span style="color: #008000">Aaron.xu&nbsp;13174115@qq.com</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />targets&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;main<br /></span><span style="color: #008000">#</span><span style="color: #008000">CFLAGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;-g<br />#LDFLAGS&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;-rdynamic<br />#INC_PATH&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;-I&nbsp;../</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />CXX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;g</span><span style="color: #000000">++</span><span style="color: #000000"><br />SRC_EXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cpp<br />SRC_FILE&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;$(wildcard&nbsp;</span><span style="color: #000000">*.</span><span style="color: #000000">$(SRC_EXT))<br /><br />ifeq&nbsp;(</span><span style="color: #000000">,</span><span style="color: #000000">$(SRC_FILE))<br />&nbsp;&nbsp;&nbsp;&nbsp;SRC_EXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;SRC_FILE&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;$(wildcard&nbsp;</span><span style="color: #000000">*.</span><span style="color: #000000">$(SRC_EXT))<br />endif<br /><br />OBJ_FILE&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;$(patsubst&nbsp;</span><span style="color: #000000">%.</span><span style="color: #000000">$(SRC_EXT)</span><span style="color: #000000">,%.</span><span style="color: #000000">o</span><span style="color: #000000">,</span><span style="color: #000000">$(wildcard&nbsp;</span><span style="color: #000000">*.</span><span style="color: #000000">$(SRC_EXT)))<br />HEADER_FILE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;$(wildcard&nbsp;</span><span style="color: #000000">*.</span><span style="color: #000000">h)<br /><br /><br /></span><span style="color: #000000">.</span><span style="color: #000000">PHONY</span><span style="color: #000000">:</span><span style="color: #000000">all</span><span style="color: #000000">,</span><span style="color: #000000">clean</span><span style="color: #000000">,</span><span style="color: #000000">test<br /><br />all</span><span style="color: #000000">:</span><span style="color: #000000">$(targets)<br /><br />$(targets)</span><span style="color: #000000">:</span><span style="color: #000000">$(OBJ_FILE)<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CXX)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">o&nbsp;$@&nbsp;$</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;$(LDFLAGS)&nbsp;$(INC_PATH)<br /><br /></span><span style="color: #008000">#</span><span style="color: #008000">$(OBJ_FILE):<br />#$(CXX)&nbsp;$(patsubst&nbsp;%.o,%.$(SRC_EXT),$@)&nbsp;-c&nbsp;$(CFLAGS)&nbsp;-o&nbsp;$@</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #000000">%.</span><span style="color: #000000">o&nbsp;</span><span style="color: #000000">:</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%.</span><span style="color: #000000">$(SRC_EXT)&nbsp;$(HEADER_FILE)<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CXX)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">o&nbsp;$@&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">c&nbsp;$</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;&nbsp;$(CFLAGS)&nbsp;$(INC_PATH)<br /><br />clean</span><span style="color: #000000">:</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;</span><span style="color: #000000">*.</span><span style="color: #000000">o<br />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;$(targets)<br /><br />test</span><span style="color: #000000">:</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">./</span><span style="color: #000000">$(targets)<br /></span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/aaxron/aggbug/171250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-04-13 14:58 <a href="http://www.cppblog.com/aaxron/archive/2012/04/13/171250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux目录遍历</title><link>http://www.cppblog.com/aaxron/archive/2012/03/25/168882.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sun, 25 Mar 2012 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/03/25/168882.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/168882.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/03/25/168882.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/168882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/168882.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unistd.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">types.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">stat.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">dirent.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;USER_LIST_FILE&nbsp;"./UserInfo.txt"</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;USER_LIST_PHOTODIR&nbsp;"./user-photo"</span><span style="color: #000000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;GetUserList()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;DIR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;pDir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fopen(USER_LIST_FILE,</span><span style="color: #000000">"</span><span style="color: #000000">r</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fp</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">file&nbsp;open&nbsp;fail&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pDir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;opendir(USER_LIST_PHOTODIR);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pDir</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">dir&nbsp;open&nbsp;fail&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;dirent&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pDirent;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">((pDirent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;readdir(pDir))&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pDirent</span><span style="color: #000000">-&gt;</span><span style="color: #000000">d_type&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;DT_REG)</span><span style="color: #008000">//</span><span style="color: #008000">普通文件</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">d_type:%d,d_name:&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,pDirent</span><span style="color: #000000">-&gt;</span><span style="color: #000000">d_type,pDirent</span><span style="color: #000000">-&gt;</span><span style="color: #000000">d_name);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GetUserList();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}</span></div><br />结构体
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;File&nbsp;types&nbsp;for&nbsp;`d_type'.&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">enum</span><span style="color: #000000"><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_UNKNOWN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_FIFO&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_CHR&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_DIR&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_BLK&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_REG&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_LNK&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_SOCK&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">,<br />&nbsp;&nbsp;&nbsp;&nbsp;DT_WHT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000"><br />};</span></div><br /><br /><br /> <img src ="http://www.cppblog.com/aaxron/aggbug/168882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-03-25 10:57 <a href="http://www.cppblog.com/aaxron/archive/2012/03/25/168882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单文件版SHA1函数</title><link>http://www.cppblog.com/aaxron/archive/2012/01/12/164067.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 12 Jan 2012 09:04:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/01/12/164067.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/164067.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/01/12/164067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/164067.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/164067.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">SHA1.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /><br /><br /><br />std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;SHA1(std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;s)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;HEX_CHAR[]</span><span style="color: #000000; ">=</span><span style="color: #000000; ">{</span><span style="color: #000000; ">'</span><span style="color: #000000; ">0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">1</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">2</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">3</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">4</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">5</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">6</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">7</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">8</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">9</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">a</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">b</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">c</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">d</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">e</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">f</span><span style="color: #000000; ">'</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;K[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">0x5A827999</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0x6ED9EBA1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0x8F1BBCDC</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0xCA62C1D6</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">扩展成K*512位</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">data;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;l;<br />&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s.length()</span><span style="color: #000000; ">*</span><span style="color: #000000; ">8</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">[((l</span><span style="color: #000000; ">/</span><span style="color: #000000; ">512</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">512</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(data,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(data[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">])</span><span style="color: #000000; ">*</span><span style="color: #000000; ">((l</span><span style="color: #000000; ">/</span><span style="color: #000000; ">512</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">512</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;s.length();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;s[i]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;data[s.length()&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0x80</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">-</span><span style="color: #000000; ">(s.length()</span><span style="color: #000000; ">%</span><span style="color: #000000; ">4</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;data[((l</span><span style="color: #000000; ">/</span><span style="color: #000000; ">512</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">512</span><span style="color: #000000; ">/</span><span style="color: #000000; ">32</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">=</span><span style="color: #000000; ">l;<br />&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(l</span><span style="color: #000000; ">/</span><span style="color: #000000; ">512</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始计算</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">5</span><span style="color: #000000; ">],&nbsp;G[</span><span style="color: #000000; ">5</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;G[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0x67452301</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;G[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0xEFCDAB89</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;G[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0x98BADCFE</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;G[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0x10325476</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;G[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0xC3D2E1F0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">l;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;W[</span><span style="color: #000000; ">80</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W[t]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;data[i</span><span style="color: #000000; ">*</span><span style="color: #000000; ">16</span><span style="color: #000000; ">+</span><span style="color: #000000; ">t];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">80</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;W[t</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;W[t</span><span style="color: #000000; ">-</span><span style="color: #000000; ">8</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;W[t</span><span style="color: #000000; ">-</span><span style="color: #000000; ">14</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;W[t</span><span style="color: #000000; ">-</span><span style="color: #000000; ">16</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W[t]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(tmp&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(tmp&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">31</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H[t]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;G[t];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">27</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;((H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">])&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">~</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]))&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;W[t]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;K[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">)</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);&nbsp;H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">40</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">27</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">])&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;W[t]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;K[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">)</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);&nbsp;H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">40</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">60</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">27</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;((H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">])</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">])</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]))&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;W[t]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;K[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">)</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);&nbsp;H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">60</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">80</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">27</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">])&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;W[t]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;K[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">)</span><span style="color: #000000; ">|</span><span style="color: #000000; ">(H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);&nbsp;H[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];&nbsp;H[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;t</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[t]&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;H[t];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buf[</span><span style="color: #000000; ">41</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">40</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;HEX_CHAR[(G[i&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(</span><span style="color: #000000; ">7</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">))))</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">0xf</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;buf[</span><span style="color: #000000; ">40</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;std::</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">(buf);<br />}<br /><br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">Test<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">#include&nbsp;&lt;iostream&gt;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">using&nbsp;namespace&nbsp;std;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">int&nbsp;main(int&nbsp;argc,&nbsp;char*&nbsp;argv[])<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">{<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;s[100];<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;while(true){<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s",&nbsp;s);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;&nbsp;SHA1(s)&lt;&lt;&nbsp;endl;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">}</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/164067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-01-12 17:04 <a href="http://www.cppblog.com/aaxron/archive/2012/01/12/164067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX 错误代码</title><link>http://www.cppblog.com/aaxron/archive/2012/01/06/163702.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 06 Jan 2012 03:15:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2012/01/06/163702.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/163702.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2012/01/06/163702.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/163702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/163702.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">LINUX&nbsp;错误代码<br /></span>[转自]<span style="color: #000000; "><br />下面这个例子列出了所有系统定义的错误代码及错误描述<br />源代码是：<br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">***********关于本文档********************************************<br />*filename:&nbsp;strerror.c<br />*purpose:&nbsp;列出了系统定义的所有错误代码及描述<br />*wrote&nbsp;by:&nbsp;zhoulifa(zhoulifa@163.com)&nbsp;周立发(</span><span style="color: #008000; text-decoration: underline; ">http://zhoulifa.bokee.com</span><span style="color: #008000; ">)<br /></span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;for&nbsp;strerror&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">errno.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">&nbsp;argv)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">256</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">errno.%02d&nbsp;is:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;i,&nbsp;strerror(i));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /><br />&nbsp;<br /><br />编译此程序用命令：<br />gcc&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;strerror.c<br />执行程序：<br />.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">a.</span><span style="color: #0000FF; ">out</span><span style="color: #000000; "><br />输出如下：<br />errno.</span><span style="color: #000000; ">00</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Success<br />errno.</span><span style="color: #000000; ">01</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Operation&nbsp;not&nbsp;permitted<br />errno.</span><span style="color: #000000; ">02</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory<br />errno.</span><span style="color: #000000; ">03</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;such&nbsp;process<br />errno.</span><span style="color: #000000; ">04</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Interrupted&nbsp;system&nbsp;call<br />errno.</span><span style="color: #000000; ">05</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Input</span><span style="color: #000000; ">/</span><span style="color: #000000; ">output&nbsp;error<br />errno.</span><span style="color: #000000; ">06</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;such&nbsp;device&nbsp;or&nbsp;address<br />errno.</span><span style="color: #000000; ">07</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Argument&nbsp;list&nbsp;too&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; "><br />errno.</span><span style="color: #000000; ">08</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Exec&nbsp;format&nbsp;error<br />errno.</span><span style="color: #000000; ">09</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Bad&nbsp;file&nbsp;descriptor<br />errno.</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;child&nbsp;processes<br />errno.</span><span style="color: #000000; ">11</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Resource&nbsp;temporarily&nbsp;unavailable<br />errno.</span><span style="color: #000000; ">12</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Cannot&nbsp;allocate&nbsp;memory<br />errno.</span><span style="color: #000000; ">13</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Permission&nbsp;denied<br />errno.</span><span style="color: #000000; ">14</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Bad&nbsp;address<br />errno.</span><span style="color: #000000; ">15</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Block&nbsp;device&nbsp;required<br />errno.</span><span style="color: #000000; ">16</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Device&nbsp;or&nbsp;resource&nbsp;busy<br />errno.</span><span style="color: #000000; ">17</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;File&nbsp;exists<br />errno.</span><span style="color: #000000; ">18</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;cross</span><span style="color: #000000; ">-</span><span style="color: #000000; ">device&nbsp;link<br />errno.</span><span style="color: #000000; ">19</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;such&nbsp;device<br />errno.</span><span style="color: #000000; ">20</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Not&nbsp;a&nbsp;directory<br />errno.</span><span style="color: #000000; ">21</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Is&nbsp;a&nbsp;directory<br />errno.</span><span style="color: #000000; ">22</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;argument<br />errno.</span><span style="color: #000000; ">23</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Too&nbsp;many&nbsp;open&nbsp;files&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;system<br />errno.</span><span style="color: #000000; ">24</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Too&nbsp;many&nbsp;open&nbsp;files<br />errno.</span><span style="color: #000000; ">25</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Inappropriate&nbsp;ioctl&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;device<br />errno.</span><span style="color: #000000; ">26</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Text&nbsp;file&nbsp;busy<br />errno.</span><span style="color: #000000; ">27</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;File&nbsp;too&nbsp;large<br />errno.</span><span style="color: #000000; ">28</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;space&nbsp;left&nbsp;on&nbsp;device<br />errno.</span><span style="color: #000000; ">29</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Illegal&nbsp;seek<br />errno.</span><span style="color: #000000; ">30</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Read</span><span style="color: #000000; ">-</span><span style="color: #000000; ">only&nbsp;file&nbsp;system<br />errno.</span><span style="color: #000000; ">31</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Too&nbsp;many&nbsp;links<br />errno.</span><span style="color: #000000; ">32</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Broken&nbsp;pipe<br />errno.</span><span style="color: #000000; ">33</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Numerical&nbsp;argument&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;of&nbsp;domain<br />errno.</span><span style="color: #000000; ">34</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Numerical&nbsp;result&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;of&nbsp;range<br />errno.</span><span style="color: #000000; ">35</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Resource&nbsp;deadlock&nbsp;avoided<br />errno.</span><span style="color: #000000; ">36</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;File&nbsp;name&nbsp;too&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; "><br />errno.</span><span style="color: #000000; ">37</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;locks&nbsp;available<br />errno.</span><span style="color: #000000; ">38</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Function&nbsp;not&nbsp;implemented<br />errno.</span><span style="color: #000000; ">39</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Directory&nbsp;not&nbsp;empty<br />errno.</span><span style="color: #000000; ">40</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Too&nbsp;many&nbsp;levels&nbsp;of&nbsp;symbolic&nbsp;links<br />errno.</span><span style="color: #000000; ">41</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Unknown&nbsp;error&nbsp;</span><span style="color: #000000; ">41</span><span style="color: #000000; "><br />errno.</span><span style="color: #000000; ">42</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;message&nbsp;of&nbsp;desired&nbsp;type<br />errno.</span><span style="color: #000000; ">43</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Identifier&nbsp;removed<br />errno.</span><span style="color: #000000; ">44</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Channel&nbsp;number&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;of&nbsp;range<br />errno.</span><span style="color: #000000; ">45</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Level&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;not&nbsp;synchronized<br />errno.</span><span style="color: #000000; ">46</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Level&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;halted<br />errno.</span><span style="color: #000000; ">47</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Level&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;reset<br />errno.</span><span style="color: #000000; ">48</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Link&nbsp;number&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;of&nbsp;range<br />errno.</span><span style="color: #000000; ">49</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Protocol&nbsp;driver&nbsp;not&nbsp;attached<br />errno.</span><span style="color: #000000; ">50</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;CSI&nbsp;structure&nbsp;available<br />errno.</span><span style="color: #000000; ">51</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Level&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;halted<br />errno.</span><span style="color: #000000; ">52</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;exchange<br />errno.</span><span style="color: #000000; ">53</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;request&nbsp;descriptor<br />errno.</span><span style="color: #000000; ">54</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Exchange&nbsp;full<br />errno.</span><span style="color: #000000; ">55</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;anode<br />errno.</span><span style="color: #000000; ">56</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;request&nbsp;code<br />errno.</span><span style="color: #000000; ">57</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;slot<br />errno.</span><span style="color: #000000; ">58</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Unknown&nbsp;error&nbsp;</span><span style="color: #000000; ">58</span><span style="color: #000000; "><br />errno.</span><span style="color: #000000; ">59</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Bad&nbsp;font&nbsp;file&nbsp;format<br />errno.</span><span style="color: #000000; ">60</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Device&nbsp;not&nbsp;a&nbsp;stream<br />errno.</span><span style="color: #000000; ">61</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;data&nbsp;available<br />errno.</span><span style="color: #000000; ">62</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Timer&nbsp;expired<br />errno.</span><span style="color: #000000; ">63</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Out&nbsp;of&nbsp;streams&nbsp;resources<br />errno.</span><span style="color: #000000; ">64</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Machine&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;not&nbsp;on&nbsp;the&nbsp;network<br />errno.</span><span style="color: #000000; ">65</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Package&nbsp;not&nbsp;installed<br />errno.</span><span style="color: #000000; ">66</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Object&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;remote<br />errno.</span><span style="color: #000000; ">67</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Link&nbsp;has&nbsp;been&nbsp;severed<br />errno.</span><span style="color: #000000; ">68</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Advertise&nbsp;error<br />errno.</span><span style="color: #000000; ">69</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Srmount&nbsp;error<br />errno.</span><span style="color: #000000; ">70</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Communication&nbsp;error&nbsp;on&nbsp;send<br />errno.</span><span style="color: #000000; ">71</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Protocol&nbsp;error<br />errno.</span><span style="color: #000000; ">72</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Multihop&nbsp;attempted<br />errno.</span><span style="color: #000000; ">73</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;RFS&nbsp;specific&nbsp;error<br />errno.</span><span style="color: #000000; ">74</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Bad&nbsp;message<br />errno.</span><span style="color: #000000; ">75</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Value&nbsp;too&nbsp;large&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;defined&nbsp;data&nbsp;type<br />errno.</span><span style="color: #000000; ">76</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Name&nbsp;not&nbsp;unique&nbsp;on&nbsp;network<br />errno.</span><span style="color: #000000; ">77</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;File&nbsp;descriptor&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;bad&nbsp;state<br />errno.</span><span style="color: #000000; ">78</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Remote&nbsp;address&nbsp;changed<br />errno.</span><span style="color: #000000; ">79</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Can&nbsp;not&nbsp;access&nbsp;a&nbsp;needed&nbsp;shared&nbsp;library<br />errno.</span><span style="color: #000000; ">80</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Accessing&nbsp;a&nbsp;corrupted&nbsp;shared&nbsp;library<br />errno.</span><span style="color: #000000; ">81</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;.lib&nbsp;section&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;a.</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;corrupted<br />errno.</span><span style="color: #000000; ">82</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Attempting&nbsp;to&nbsp;link&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;too&nbsp;many&nbsp;shared&nbsp;libraries<br />errno.</span><span style="color: #000000; ">83</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Cannot&nbsp;exec&nbsp;a&nbsp;shared&nbsp;library&nbsp;directly<br />errno.</span><span style="color: #000000; ">84</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Invalid&nbsp;or&nbsp;incomplete&nbsp;multibyte&nbsp;or&nbsp;wide&nbsp;character<br />errno.</span><span style="color: #000000; ">85</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Interrupted&nbsp;system&nbsp;call&nbsp;should&nbsp;be&nbsp;restarted<br />errno.</span><span style="color: #000000; ">86</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Streams&nbsp;pipe&nbsp;error<br />errno.</span><span style="color: #000000; ">87</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Too&nbsp;many&nbsp;users<br />errno.</span><span style="color: #000000; ">88</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Socket&nbsp;operation&nbsp;on&nbsp;non</span><span style="color: #000000; ">-</span><span style="color: #000000; ">socket<br />errno.</span><span style="color: #000000; ">89</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Destination&nbsp;address&nbsp;required<br />errno.</span><span style="color: #000000; ">90</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Message&nbsp;too&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; "><br />errno.</span><span style="color: #000000; ">91</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Protocol&nbsp;wrong&nbsp;type&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;socket<br />errno.</span><span style="color: #000000; ">92</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Protocol&nbsp;not&nbsp;available<br />errno.</span><span style="color: #000000; ">93</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Protocol&nbsp;not&nbsp;supported<br />errno.</span><span style="color: #000000; ">94</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Socket&nbsp;type&nbsp;not&nbsp;supported<br />errno.</span><span style="color: #000000; ">95</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Operation&nbsp;not&nbsp;supported<br />errno.</span><span style="color: #000000; ">96</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Protocol&nbsp;family&nbsp;not&nbsp;supported<br />errno.</span><span style="color: #000000; ">97</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Address&nbsp;family&nbsp;not&nbsp;supported&nbsp;by&nbsp;protocol<br />errno.</span><span style="color: #000000; ">98</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Address&nbsp;already&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;use<br />errno.</span><span style="color: #000000; ">99</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Cannot&nbsp;assign&nbsp;requested&nbsp;address<br />errno.</span><span style="color: #000000; ">100</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Network&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;down<br />errno.</span><span style="color: #000000; ">101</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Network&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;unreachable<br />errno.</span><span style="color: #000000; ">102</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Network&nbsp;dropped&nbsp;connection&nbsp;on&nbsp;reset<br />errno.</span><span style="color: #000000; ">103</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Software&nbsp;caused&nbsp;connection&nbsp;abort<br />errno.</span><span style="color: #000000; ">104</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Connection&nbsp;reset&nbsp;by&nbsp;peer<br />errno.</span><span style="color: #000000; ">105</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;buffer&nbsp;space&nbsp;available<br />errno.</span><span style="color: #000000; ">106</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Transport&nbsp;endpoint&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;already&nbsp;connected<br />errno.</span><span style="color: #000000; ">107</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Transport&nbsp;endpoint&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;not&nbsp;connected<br />errno.</span><span style="color: #000000; ">108</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Cannot&nbsp;send&nbsp;after&nbsp;transport&nbsp;endpoint&nbsp;shutdown<br />errno.</span><span style="color: #000000; ">109</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Too&nbsp;many&nbsp;references:&nbsp;cannot&nbsp;splice<br />errno.</span><span style="color: #000000; ">110</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Connection&nbsp;timed&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; "><br />errno.</span><span style="color: #000000; ">111</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Connection&nbsp;refused<br />errno.</span><span style="color: #000000; ">112</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Host&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;down<br />errno.</span><span style="color: #000000; ">113</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;route&nbsp;to&nbsp;host<br />errno.</span><span style="color: #000000; ">114</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Operation&nbsp;already&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;progress<br />errno.</span><span style="color: #000000; ">115</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Operation&nbsp;now&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;progress<br />errno.</span><span style="color: #000000; ">116</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Stale&nbsp;NFS&nbsp;file&nbsp;handle<br />errno.</span><span style="color: #000000; ">117</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Structure&nbsp;needs&nbsp;cleaning<br />errno.</span><span style="color: #000000; ">118</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Not&nbsp;a&nbsp;XENIX&nbsp;named&nbsp;type&nbsp;file<br />errno.</span><span style="color: #000000; ">119</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;XENIX&nbsp;semaphores&nbsp;available<br />errno.</span><span style="color: #000000; ">120</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Is&nbsp;a&nbsp;named&nbsp;type&nbsp;file<br />errno.</span><span style="color: #000000; ">121</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Remote&nbsp;I</span><span style="color: #000000; ">/</span><span style="color: #000000; ">O&nbsp;error<br />errno.</span><span style="color: #000000; ">122</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Disk&nbsp;quota&nbsp;exceeded<br />errno.</span><span style="color: #000000; ">123</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;No&nbsp;medium&nbsp;found<br />errno.</span><span style="color: #000000; ">124</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Wrong&nbsp;medium&nbsp;type<br />errno.</span><span style="color: #000000; ">125</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Operation&nbsp;canceled<br />errno.</span><span style="color: #000000; ">126</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Required&nbsp;key&nbsp;not&nbsp;available<br />errno.</span><span style="color: #000000; ">127</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Key&nbsp;has&nbsp;expired<br />errno.</span><span style="color: #000000; ">128</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Key&nbsp;has&nbsp;been&nbsp;revoked<br />errno.</span><span style="color: #000000; ">129</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Key&nbsp;was&nbsp;rejected&nbsp;by&nbsp;service<br />errno.</span><span style="color: #000000; ">130</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Owner&nbsp;died<br />errno.</span><span style="color: #000000; ">131</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;State&nbsp;not&nbsp;recoverable<br />errno.</span><span style="color: #000000; ">132</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">:&nbsp;Unknown&nbsp;error&nbsp;</span><span style="color: #000000; ">132</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">132</span><span style="color: #000000; ">-</span><span style="color: #000000; ">255全是Unknown&nbsp;error&nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/163702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2012-01-06 11:15 <a href="http://www.cppblog.com/aaxron/archive/2012/01/06/163702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为项目定制VC2008</title><link>http://www.cppblog.com/aaxron/archive/2011/11/09/159849.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 09 Nov 2011 01:01:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/09/159849.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/159849.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/09/159849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/159849.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/159849.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #800080">@rem </span><span style="color: #000000">VC2008ForArmLinux</span><span style="color: #800080"><br />@rem</span><span style="color: #000000">&nbsp;这样的启动的批处理</span><span style="color: #000000">,</span><span style="color: #000000">定制启动VC2008</span><span style="color: #000000">,</span><span style="color: #000000">就是一个纯C</span><span style="color: #000000">/</span><span style="color: #000000">C</span><span style="color: #000000">++</span><span style="color: #000000">的IDE</span><span style="color: #000000">,</span><span style="color: #000000">不包含MS的CRT库及头文件等</span><span style="color: #000000">.</span><span style="color: #000000">这样定制可以用来开发Linux下的项目</span><span style="color: #000000">.</span><span style="color: #000000"><br /><br /></span><span style="color: #800080">@SET</span><span style="color: #000000">&nbsp;VSINSTALLDIR</span><span style="color: #000000">=</span><span style="color: #000000">C</span><span style="color: #000000">:\</span><span style="color: #000000">Program&nbsp;Files</span><span style="color: #000000">\</span><span style="color: #000000">Microsoft</span><span style="color: #000000">&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000">9.0</span><span style="color: #000000"><br /></span><span style="color: #800080">@SET</span><span style="color: #000000">&nbsp;VCINSTALLDIR</span><span style="color: #000000">=</span><span style="color: #000000">C</span><span style="color: #000000">:\</span><span style="color: #000000">Program&nbsp;Files</span><span style="color: #000000">\</span><span style="color: #000000">Microsoft&nbsp;</span><span style="color: #000000">Visual&nbsp;Studio&nbsp;</span><span style="color: #000000">9.0</span><span style="color: #000000">\</span><span style="color: #000000">VC</span><span style="color: #000000"><br /></span><span style="color: #993366">@rem </span><span style="color: #000000">这里可以定制INCLUDE的路径,以适应项目.</span><span style="color: #000000"><br /></span><span style="color: #800080">@set</span><span style="color: #000000">&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="font-family: Verdana; color: #000000"><strong>INCLUDE=</strong></span><span style="color: #000000"> 
<div style="display: inline-block">
<div>C:\Program Files\ASIDE\MetaWare\arc\inc</div></div></span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br /></span><span style="color: #800080">@set</span><span style="color: #000000">&nbsp;</span><span style="color: #000000; font-weight: bold">"</span><span style="font-family: Verdana; color: #000000; font-weight: bold">LIB=</span><span style="color: #000000; font-weight: bold">"</span><span style="color: #000000"><br /></span><span style="color: #800080">@set</span><span style="color: #000000">&nbsp;</span><span style="font-family: Verdana; color: #000000"><strong>PATH</strong></span><span style="color: #000000">=</span><span style="color: #000000">C</span><span style="color: #000000">:\</span><span style="color: #000000">Program&nbsp;Files</span><span style="color: #000000">\</span><span style="color: #000000">Microsoft&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000">9.0</span><span style="color: #000000">\</span><span style="color: #000000">Common7</span><span style="color: #000000">\</span><span style="color: #000000">IDE;C</span><span style="color: #000000">:\</span><span style="color: #000000">Program&nbsp;Files</span><span style="color: #000000">\</span><span style="color: #000000">Microsoft&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000">9.0</span><span style="color: #000000">\</span><span style="color: #000000">VC</span><span style="color: #000000">\</span><span style="color: #000000">BIN;C</span><span style="color: #000000">:\</span><span style="color: #000000">Program&nbsp;Files</span><span style="color: #000000">\</span><span style="color: #000000">Microsoft&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000">9.0</span><span style="color: #000000">\</span><span style="color: #000000">Common7</span><span style="color: #000000">\</span><span style="color: #000000">Tools;C</span><span style="color: #000000">:\</span><span style="color: #000000">Program&nbsp;Files</span><span style="color: #000000">\</span><span style="color: #000000">Microsoft&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000">9.0</span><span style="color: #000000">\</span><span style="color: #000000">VC</span><span style="color: #000000">\</span><span style="color: #000000">VCPackages;</span><span style="color: #000000"><br /></span><span style="color: #800080">@devenv</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">use env<br /><br /></span></div><br /><img src ="http://www.cppblog.com/aaxron/aggbug/159849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-09 09:01 <a href="http://www.cppblog.com/aaxron/archive/2011/11/09/159849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debian 6 驱动开发环境搭建</title><link>http://www.cppblog.com/aaxron/archive/2011/11/01/159454.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Tue, 01 Nov 2011 06:24:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/01/159454.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/159454.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/01/159454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/159454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/159454.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Debian&nbsp;</span><span style="color: #800000; ">6</span><span style="color: #000000; ">&nbsp;驱动开发环境搭建<br /></span><span style="color: #800000; ">1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">安装相关工具<br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">get&nbsp;install&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">y&nbsp;gcc&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;gdb&nbsp;make&nbsp;build</span><span style="color: #000000; ">-</span><span style="color: #000000; ">essential<br /><br /></span><span style="color: #800000; ">2</span><span style="color: #000000; ">.</span><span style="color: #000000; ">查看系统版本</span><span style="color: #000000; ">,</span><span style="color: #000000; ">并安装内核头文件<br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;uname&nbsp;-r</span><span style="color: #008000; "><br /></span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">cache&nbsp;search&nbsp;linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">get&nbsp;install&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">y&nbsp;linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">3</span><span style="color: #000000; ">.</span><span style="color: #000000; ">查看内核头文件位置<br />看下会安装到哪</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">cache&nbsp;show&nbsp;linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br /><br />有这么句</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />These&nbsp;files&nbsp;are&nbsp;going&nbsp;to&nbsp;be&nbsp;installed&nbsp;into<br /></span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;and&nbsp;can&nbsp;be&nbsp;used&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;building&nbsp;modules<br /><br />就是这里啦</span><span style="color: #000000; ">.</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">4</span><span style="color: #000000; ">.</span><span style="color: #000000; ">好了</span><span style="color: #000000; ">,</span><span style="color: #000000; ">接下来写测试例子</span><span style="color: #000000; ">:</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">,</span><span style="color: #000000; ">抄了http</span><span style="color: #000000; ">://</span><span style="color: #000000; ">bbs</span><span style="color: #000000; ">.</span><span style="color: #000000; ">chinaunix</span><span style="color: #000000; ">.</span><span style="color: #000000; ">net</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread</span><span style="color: #000000; ">-</span><span style="color: #800000; ">3570849</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">html<br />上的代码</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />文件1</span><span style="color: #000000; ">:</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">c<br /></span><span style="color: #008000; ">#</span><span style="color: #008000; ">include&nbsp;&lt;linux/init.h&gt;<br />#include&nbsp;&lt;linux/module.h&gt;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">MODULE_LICENSE(</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">GPL</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">);<br /><br />static&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;hello_init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">Hello,&nbsp;world\n</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0</span><span style="color: #000000; ">;<br />}<br /><br />static&nbsp;void&nbsp;hello_exit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">Goodbye,&nbsp;cruel&nbsp;world\n</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">);<br />}<br /><br />module_init(hello_init);<br />module_exit(hello_exit);<br /><br />文件2</span><span style="color: #000000; ">:</span><span style="color: #000000; ">Makefile</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />obj</span><span style="color: #000000; ">-</span><span style="color: #000000; ">m&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o<br />KERNELDIR&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; "><br />PWD&nbsp;</span><span style="color: #000000; ">:=</span><span style="color: #000000; ">$(shell&nbsp;pwd)<br /></span><span style="color: #000000; ">.</span><span style="color: #000000; ">PHONY</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;test&nbsp;clean&nbsp;all<br />all</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">C&nbsp;$(KERNELDIR)&nbsp;M</span><span style="color: #000000; ">=</span><span style="color: #000000; ">$(PWD)&nbsp;modules<br />clean</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rf&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">o&nbsp;</span><span style="color: #000000; ">*~</span><span style="color: #000000; ">&nbsp;core&nbsp;</span><span style="color: #000000; ">.</span><span style="color: #000000; ">depend&nbsp;</span><span style="color: #000000; ">.*.</span><span style="color: #000000; ">cmd&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">ko&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">mod</span><span style="color: #000000; ">.</span><span style="color: #000000; ">c&nbsp;</span><span style="color: #000000; ">.</span><span style="color: #000000; ">tmp_versionsm&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">order&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">symvers<br /><br />test</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;insmod&nbsp;</span><span style="color: #000000; ">./</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">ko<br />&nbsp;&nbsp;&nbsp;&nbsp;rmmod&nbsp;hello<br />&nbsp;&nbsp;&nbsp;&nbsp;dmesg&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #800000; ">5</span><span style="color: #000000; ">.</span><span style="color: #000000; ">好了</span><span style="color: #000000; ">,</span><span style="color: #000000; ">现在测试开始</span><span style="color: #000000; ">,</span><span style="color: #000000; ">成功的话</span><span style="color: #000000; ">,</span><span style="color: #000000; ">就可以看到下面的文字了</span><span style="color: #000000; ">.</span><span style="color: #000000; "><br />如果有问题的话</span><span style="color: #000000; ">,</span><span style="color: #000000; ">向google大神请教吧</span><span style="color: #000000; ">.</span><span style="color: #000000; ">另外要看<br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">cpp&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;make&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">make&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">C&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; ">&nbsp;M</span><span style="color: #000000; ">=/</span><span style="color: #000000; ">root</span><span style="color: #000000; ">/</span><span style="color: #000000; ">cpp&nbsp;modules<br />make[</span><span style="color: #800000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;Entering&nbsp;directory&nbsp;`</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">src</span><span style="color: #000000; ">/</span><span style="color: #000000; ">linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">headers</span><span style="color: #000000; ">-</span><span style="color: #800000; ">2.6</span><span style="color: #000000; ">.</span><span style="color: #800000; ">32</span><span style="color: #000000; ">-</span><span style="color: #800000; ">5</span><span style="color: #000000; ">-</span><span style="color: #800000; ">686</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; "><br />&nbsp;&nbsp;CC&nbsp;[M]&nbsp;&nbsp;/root/cpp/hello.o<br />&nbsp;&nbsp;Building&nbsp;modules,&nbsp;stage&nbsp;2.<br />&nbsp;&nbsp;MODPOST&nbsp;1&nbsp;modules<br />&nbsp;&nbsp;CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/root/cpp/hello.mod.o<br />&nbsp;&nbsp;LD&nbsp;[M]&nbsp;&nbsp;/root/cpp/hello.ko<br />make[1]:&nbsp;Leaving&nbsp;directory&nbsp;`/usr/src/linux-headers-2.6.32-5-686</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">cpp&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;make&nbsp;test</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">insmod&nbsp;</span><span style="color: #000000; ">./</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">.</span><span style="color: #000000; ">ko<br />rmmod&nbsp;hello<br />dmesg&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c<br />[&nbsp;&nbsp;</span><span style="color: #800000; ">673.500413</span><span style="color: #000000; ">]&nbsp;Hello</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;world<br />[&nbsp;&nbsp;</span><span style="color: #800000; ">673.504907</span><span style="color: #000000; ">]&nbsp;Goodbye</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;cruel&nbsp;world<br />root@</span><span style="color: #800000; ">192.168</span><span style="color: #000000; ">.</span><span style="color: #800000; ">20.128</span><span style="color: #000000; ">:~/</span><span style="color: #000000; ">cpp&nbsp;</span><span style="color: #008000; ">#<br /></span><span style="color: #000000; "><br /><br /></span><span style="color: #800000; ">6</span><span style="color: #000000; ">.</span><span style="color: #000000; ">最后</span><span style="color: #000000; ">.</span><span style="color: #000000; ">安装开发帮助文档<br />apt</span><span style="color: #000000; ">-</span><span style="color: #000000; ">get&nbsp;install&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">y&nbsp;manpages</span><span style="color: #000000; ">-</span><span style="color: #000000; ">kernel</span><span style="color: #000000; ">-</span><span style="color: #000000; ">dev&nbsp;linux</span><span style="color: #000000; ">-</span><span style="color: #000000; ">manual<br />man&nbsp;</span><span style="color: #800000; ">9</span><span style="color: #000000; ">&nbsp;printk<br />man&nbsp;</span><span style="color: #800000; ">9</span><span style="color: #000000; ">&nbsp;module_init<br /><br />参考资料</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;<br />http</span><span style="color: #000000; ">://</span><span style="color: #000000; ">bbs</span><span style="color: #000000; ">.</span><span style="color: #000000; ">chinaunix</span><span style="color: #000000; ">.</span><span style="color: #000000; ">net</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread</span><span style="color: #000000; ">-</span><span style="color: #800000; ">3570849</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">-</span><span style="color: #800000; ">1</span><span style="color: #000000; ">.</span><span style="color: #000000; ">html</span></div> <img src ="http://www.cppblog.com/aaxron/aggbug/159454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-01 14:24 <a href="http://www.cppblog.com/aaxron/archive/2011/11/01/159454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单Makefile的编写</title><link>http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 12 Oct 2011 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/158144.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/158144.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/158144.html</trackback:ping><description><![CDATA[<div><div><div><span style="color: red; font-size: 18pt;">指定目标</span></div><br />all<br />这个伪目标是所有目标的目标，其功能一般是编译所有的目标。<br /><br />clean<br />这个伪目标功能是删除所有被make创建的文件。<br /><br />install<br />这个伪目标功能是安装已编译好的程序，其实就是把目标执行文件拷贝到指定的目标中去。<br /><br />print<br />这个伪目标的功能是例出改变过的源文件。<br /><br />tar<br />这个伪目标功能是把源程序打包备份。也就是一个tar文件。<br /><br />dist<br />这个伪目标功能是创建一个压缩文件，一般是把tar文件压成Z文件。或是gz文件。<br /><br />TAGS<br />这个伪目标功能是更新所有的目标，以备完整地重编译使用。<br /><br />check和test<br />这两个伪目标一般用来测试makefile的流程。</div><br /><br /><div><span style="color: red; font-size: 18pt;">自动化变量</span></div><br />$@<br />表示规则中的目标文件集。在模式规则中，如果有多个目标，那么，$@就是匹配于目标中模式定义的集合。<br /><br />$^<br />所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的，那个这个变量会去除重复的依赖目标，只保留一份。<br /><div><br />$?<br />所有比目标新的依赖目标的集合。以空格分隔。</div><br />$+<br />这个变量很像$^，也是所有依赖目标的集合。只是它不去除重复的依赖目标。<br /><br />$%<br />当规划的目标文件是库文件时，$%表示规则中的目标成员名。<br />例如，如果一个目标是foo.a(bar.o)，那么，$%就是bar.o，$@就是foo.a。<br />如果目标不是函数库文件（Unix下是[.a]，Windows下是[.lib]），那么其值为空。<br /><br />$&lt;<br />依赖目标中的第一个目标名字。如果依赖目标是以模式（即%）定义的，那么$&lt;将是符合模式的一系列的文件集。注意，其是一个一个取出来的。<br /></div><br /><br /><div><span style="color: red; font-size: 18pt;">例子:</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">CCLD&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">g&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o<br />CC&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">Wall&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">c&nbsp;<br />OBJS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SocketServer</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o<br />TARGETS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">0928</span><span style="color: #000000; "><br /><br /></span><span style="color: #000000; ">.</span><span style="color: #000000; ">PHONY</span><span style="color: #000000; ">:</span><span style="color: #000000; ">all<br />all</span><span style="color: #000000; ">:</span><span style="color: #000000; ">$(TARGETS)<br /><br /><br />SocketServer</span><span style="color: #000000; ">.</span><span style="color: #000000; ">o</span><span style="color: #000000; ">:</span><span style="color: #000000; ">SocketServer</span><span style="color: #000000; ">.</span><span style="color: #000000; ">cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #800000; ">0928</span><span style="color: #000000; ">:</span><span style="color: #000000; ">$(OBJS)&nbsp;main</span><span style="color: #000000; ">.</span><span style="color: #000000; ">cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CCLD)&nbsp;$@&nbsp;$</span><span style="color: #000000; ">^</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080; ">@echo</span><span style="color: #000000; ">&nbsp;make&nbsp;success<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #000000; ">.</span><span style="color: #000000; ">PHONY</span><span style="color: #000000; ">:</span><span style="color: #000000; ">clean<br />clean</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">rm&nbsp;-rf&nbsp;${OBJS}</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rf&nbsp;</span><span style="color: #000000; ">*.</span><span style="color: #000000; ">o<br />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rf&nbsp;$(TARGETS)<br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/158144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-10-12 17:01 <a href="http://www.cppblog.com/aaxron/archive/2011/10/12/158144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>qt对话框+线程小试</title><link>http://www.cppblog.com/aaxron/archive/2011/09/22/156513.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 22 Sep 2011 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/22/156513.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/156513.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/22/156513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/156513.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/156513.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">thread.h</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#pragma&nbsp;once<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;QT3_SUPPORT</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qapplication.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qpushbutton.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">qmessagebox.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qdialog.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">QString</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Thread&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;QThread<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Thread();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">Thread();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setTObj(T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pobj);<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;flag;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pTObj;<br />};<br /><br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />Thread</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::Thread()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />Thread</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">Thread()<br />{<br /><br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Thread</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::run()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">QMessageBox::information(&nbsp;NULL,&nbsp;"Application&nbsp;name","Started.\n");</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;QString&nbsp;strText;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strText.sprintf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">flag:%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,pos);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTObj</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setWindowTitle(strText);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QThread::msleep(</span><span style="color: #000000; ">500</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Thread</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::setTObj(T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pobj)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pTObj&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pobj;<br />}</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">ProcessDialog.h</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#pragma&nbsp;once<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;QT3_SUPPORT</span><span style="color: #000000; "><br /><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qapplication.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qpushbutton.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">qmessagebox.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qdialog.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">QString</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ProcessDialog&nbsp;:</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;QDialog&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Q_OBJECT<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;ProcessDialog(QWidget</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;parent</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:btnStop(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Stop</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,btnWork(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Work</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnStop.setGeometry(&nbsp;</span><span style="color: #000000; ">62</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">40</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">75</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnWork.setGeometry(&nbsp;</span><span style="color: #000000; ">162</span><span style="color: #000000; ">,</span><span style="color: #000000; ">140</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">75</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadA.setTObj(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connect(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">btnWork,SIGNAL(&nbsp;clicked()),</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">,SLOT(start())&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connect(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">btnStop,SIGNAL(&nbsp;clicked()),</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">,SLOT(stop())&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;QPushButton&nbsp;btnStop;<br />&nbsp;&nbsp;&nbsp;&nbsp;QPushButton&nbsp;btnWork;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;slots:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;start()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnWork.setText(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Working</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadA.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadA.flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;stop()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnWork.setText(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Work</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadA.flag&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">threadA.pos&nbsp;&nbsp;=&nbsp;0;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Thread</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ProcessDialog</span><span style="color: #000000; ">&gt;</span><span style="color: #000000;">&nbsp;threadA;&nbsp;&nbsp;&nbsp;&nbsp;<br />};<br /><br /></span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">main.cpp</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;QT3_SUPPORT</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">cstdio</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qapplication.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qpushbutton.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">qmessagebox.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qdialog.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Qt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">qthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">QString</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ProcessDialog.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;QApplication&nbsp;app(&nbsp;argc,&nbsp;argv&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;ProcessDialog&nbsp;dlg;<br />&nbsp;&nbsp;&nbsp;&nbsp;app.setMainWidget(&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dlg&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;dlg.resize(</span><span style="color: #000000; ">640</span><span style="color: #000000; ">,</span><span style="color: #000000; ">480</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;dlg.setModal(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;dlg.exec();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;app.exec();<br />}<br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/156513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-22 10:24 <a href="http://www.cppblog.com/aaxron/archive/2011/09/22/156513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Socket子进程模式服务端Demo 63.cpp</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155362.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155362.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;File:&nbsp;63.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">客户端代码&nbsp;62.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">strings.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">socket.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">netinet</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arpa</span><span style="color: #000000; ">/</span><span style="color: #000000; ">inet.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;1234&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAXDATASIZE&nbsp;4096&nbsp;&nbsp;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;<br />{&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;listenfd,&nbsp;connectfd;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;socket&nbsp;descriptors&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;pid_t&nbsp;pid;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;server;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;server's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;client's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;socklen_t&nbsp;sin_size;&nbsp;<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Create&nbsp;TCP&nbsp;socket&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((listenfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Creating&nbsp;socket&nbsp;failed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;}<br /><br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;opt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SO_REUSEADDR;<br />&nbsp;setsockopt(listenfd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">opt,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(opt));<br /><br />&nbsp;bzero(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(server));<br />&nbsp;server.sin_family</span><span style="color: #000000; ">=</span><span style="color: #000000; ">AF_INET;&nbsp;<br />&nbsp;server.sin_port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">htons(PORT);&nbsp;<br />&nbsp;server.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl(INADDR_ANY);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bind(listenfd,&nbsp;(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bind&nbsp;error.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(listenfd,BACKLOG)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;calls&nbsp;listen()&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;<br /><br />&nbsp;sin_size</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in);&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">accept&nbsp;connection&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((connectfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listenfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sin_size))</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;Create&nbsp;child&nbsp;process&nbsp;to&nbsp;service&nbsp;client&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((pid</span><span style="color: #000000; ">=</span><span style="color: #000000; ">fork())</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;parent&nbsp;process&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(pid</span><span style="color: #000000; ">==</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">child&nbsp;process</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;close(listenfd);<br />&nbsp;&nbsp;&nbsp;process_cli(connectfd,&nbsp;client);<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fork()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;close(listenfd);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;close&nbsp;listenfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client)<br />{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num;<br />&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recvbuf[MAXDATASIZE],&nbsp;sendbuf[MAXDATASIZE];<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;prints&nbsp;client's&nbsp;IP&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;connected\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(connectfd,&nbsp;recvbuf,&nbsp;MAXDATASIZE,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;disconnected&nbsp;\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],num);<br />&nbsp;&nbsp;recvbuf[num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Received&nbsp;message&nbsp;From&nbsp;Client&nbsp;:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;num;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;sendbuf[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[%d]:%d\n",i,sendbuf[i]);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;send(connectfd,sendbuf,num,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;send&nbsp;to&nbsp;the&nbsp;client&nbsp;welcome&nbsp;message&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;}<br />&nbsp;close(connectfd);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;close&nbsp;connectfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />}<br /><br /><br />&nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:06 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Socket阻塞模式服务端Demo 61.cpp</title><link>http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 08 Sep 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/155363.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/155363.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/155363.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;File:&nbsp;61.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">客户端代码&nbsp;62.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">strings.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">socket.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">netinet</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arpa</span><span style="color: #000000; ">/</span><span style="color: #000000; ">inet.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;1234&nbsp;&nbsp;&nbsp;/*&nbsp;Port&nbsp;that&nbsp;will&nbsp;be&nbsp;opened&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BACKLOG&nbsp;5&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;allowed&nbsp;connections&nbsp;*/&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;MAXDATASIZE&nbsp;4096&nbsp;&nbsp;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;&nbsp;{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;listenfd,&nbsp;connectfd;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;socket&nbsp;descriptors&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;server;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;server's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;client's&nbsp;address&nbsp;information&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;socklen_t&nbsp;sin_size;&nbsp;<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Create&nbsp;TCP&nbsp;socket&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((listenfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Creating&nbsp;socket&nbsp;failed.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;}<br /><br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;opt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SO_REUSEADDR;<br />&nbsp;setsockopt(listenfd,&nbsp;SOL_SOCKET,&nbsp;SO_REUSEADDR,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">opt,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(opt));<br /><br />&nbsp;bzero(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(server));<br />&nbsp;server.sin_family</span><span style="color: #000000; ">=</span><span style="color: #000000; ">AF_INET;&nbsp;<br />&nbsp;server.sin_port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">htons(PORT);&nbsp;<br />&nbsp;server.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htonl&nbsp;(INADDR_ANY);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bind(listenfd,&nbsp;(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">server,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr))&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;handle&nbsp;exception&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bind&nbsp;error.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(listen(listenfd,BACKLOG)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;calls&nbsp;listen()&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">listen()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;}&nbsp;<br /><br />&nbsp;sin_size</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in);&nbsp;<br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((connectfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;accept(listenfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">client,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sin_size))</span><span style="color: #000000; ">==-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accept()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;process_cli(connectfd,&nbsp;client);<br />&nbsp;}<br /><br />&nbsp;close(listenfd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process_cli(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;connectfd,&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;client)<br />{<br />&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num;<br />&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;recvbuf[MAXDATASIZE],&nbsp;sendbuf[MAXDATASIZE];<br /><br />&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;prints&nbsp;client's&nbsp;IP&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;connected\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br /><br />&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recv(connectfd,&nbsp;recvbuf,&nbsp;MAXDATASIZE,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;close(connectfd);<br />&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s:%d&nbsp;Client&nbsp;was&nbsp;disconnected&nbsp;\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,inet_ntoa(client.sin_addr),&nbsp;ntohs(&nbsp;client.sin_port)&nbsp;);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recv()&nbsp;error\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">recvbuf[0]:%d,recvbuf[num-1]:%d,num:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],num);<br />&nbsp;&nbsp;recvbuf[num]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Received&nbsp;message&nbsp;From&nbsp;Client&nbsp;:&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,recvbuf);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;num;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;sendbuf[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;recvbuf[num</span><span style="color: #000000; ">-</span><span style="color: #000000; ">i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[%d]:%d\n",i,sendbuf[i]);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">printf("sendbuf[0]:%d,sendbuf[num-1]:%d,num:%d\n",sendbuf[0],sendbuf[num-1],num);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;send(connectfd,sendbuf,num,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;send&nbsp;to&nbsp;the&nbsp;client&nbsp;welcome&nbsp;message&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />&nbsp;}<br />&nbsp;close(connectfd);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;close&nbsp;connectfd&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;<br />}<br /><br /><br />&nbsp;<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/155363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-09-08 16:06 <a href="http://www.cppblog.com/aaxron/archive/2011/09/08/155363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>