﻿<?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++博客-Jiwu Bu</title><link>http://www.cppblog.com/bujiwu/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 18:12:44 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2026 18:12:44 GMT</pubDate><ttl>60</ttl><item><title>Linux内核VFS---rootfs文件系统加载</title><link>http://www.cppblog.com/bujiwu/archive/2010/07/04/119301.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 04 Jul 2010 08:58:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2010/07/04/119301.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/119301.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2010/07/04/119301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/119301.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/119301.html</trackback:ping><description><![CDATA[对linux-2.6.34源码rootfs文件系统加载学习笔记<br><br>1.内核启动调用start_kernel函数进行初始化。
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">asmlinkage&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__init&nbsp;start_kernel(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">init\Main.c:528</span><span style="color: #008000;"><br></span><span style="color: #000000;">{<br>&nbsp;&nbsp;&nbsp;&nbsp;buffer_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;key_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;security_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;vfs_caches_init(totalram_pages);</span><span style="color: #008000;">//</span><span style="color: #008000;">678行，vfs初始化</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;signals_init();<br>}</span></div>
2.start_kernel调用vfs_caches_init对vfs进行初始化。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<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;">fs\Dcach.c:2354行</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__init&nbsp;vfs_caches_init(unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;mempages)<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">.......<br>&nbsp;&nbsp;&nbsp;&nbsp;dcache_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;inode_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;files_init(mempages);<br>&nbsp;&nbsp;&nbsp;&nbsp;mnt_init();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">mnt初始化</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;bdev_cache_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;chrdev_init();<br>}<br></span></div>
<br>3.在vfs_caches_init调用fs\namespace.c 2321行的mnt_init函数<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__init&nbsp;mnt_init(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;&nbsp;&nbsp;init_rootfs();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化rootfs文件系统</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;init_mount_tree();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化加载树</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
4. fs\ramfs第308行的init_rootfs函数初始化rootfs文件系统<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__init&nbsp;init_rootfs(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;err;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bdi_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ramfs_backing_dev_info);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(err)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;err;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;register_filesystem(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">rootfs_fs_type);</span><span style="color: #008000;">//</span><span style="color: #008000;">注册rootfs文件系统</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(err)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bdi_destroy(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ramfs_backing_dev_info);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;err;<br>}</span></div>
rootfs文件系统信息fs\ramfs第289行
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;file_system_type&nbsp;rootfs_fs_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">rootfs</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;.get_sb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rootfs_get_sb,<br>&nbsp;&nbsp;&nbsp;&nbsp;.kill_sb&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;kill_litter_super,<br>};</span></div>
<br>5.调用register_filesystem函数将rootfs注册到<span style="font-weight: bold; color: #ff0000; font-family: 黑体;">file_systems</span>文件系统中。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">//fs\Filesystem.c第69行。<br>int</span><span style="color: #000000;">&nbsp;register_filesystem(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;file_system_type&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fs)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;res&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;">struct</span><span style="color: #000000;">&nbsp;file_system_type&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">&nbsp;p;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;BUG_ON(strchr(fs</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">name,&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;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(fs</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next)<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;">EBUSY;<br>&nbsp;&nbsp;&nbsp;&nbsp;INIT_LIST_HEAD(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">fs</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">fs_supers);<br>&nbsp;&nbsp;&nbsp;&nbsp;write_lock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">file_systems_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find_filesystem(fs</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">name,&nbsp;strlen(fs</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">name));//查找到文件系统加载位置<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;">p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">EBUSY;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fs;<br>&nbsp;&nbsp;&nbsp;&nbsp;write_unlock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">file_systems_lock);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;res;<br>}</span></div>
file_systems变量是所有文件系统链表的头指针。通过以上过程rootfs_fs_type就加入到了file_systems链表头的file_system_type类型的链表中。可以通过file_systems指针遍历这个链表，得到特定的文件系统file_system_type
指针。<br>  <img src ="http://www.cppblog.com/bujiwu/aggbug/119301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2010-07-04 16:58 <a href="http://www.cppblog.com/bujiwu/archive/2010/07/04/119301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]top命令详解</title><link>http://www.cppblog.com/bujiwu/archive/2010/04/27/top.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Tue, 27 Apr 2010 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2010/04/27/top.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/113700.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2010/04/27/top.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/113700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/113700.html</trackback:ping><description><![CDATA[<a href="http://blog.chinaunix.net/u/12973/showart_637900.html">http://blog.chinaunix.net/u/12973/showart_637900.html</a><br><br><br>top命令是Linux下常用的性能分析工具，能够实时显示系统中各个进程的资源占用状况，类似于Windows的任务管理器。下面详细介绍它的使用方法。
<p>
</p>
<table summary="" border="1" cellpadding="1" cellspacing="1" width="100%">
    <tbody>
        <tr>
            <td>top - 01:06:48 up&nbsp; 1:22,&nbsp; 1 user,&nbsp; load average: 0.06,
            0.60, 0.48<br>
            Tasks:&nbsp; 29 total,&nbsp;&nbsp; 1 running,&nbsp; 28 sleeping,&nbsp;&nbsp; 0 stopped,&nbsp;&nbsp; 0
            zombie<br>
            Cpu(s):&nbsp; 0.3% us,&nbsp; 1.0% sy,&nbsp; 0.0% ni, 98.7% id,&nbsp; 0.0% wa,&nbsp;
            0.0% hi,&nbsp; 0.0% si<br>
            Mem:&nbsp;&nbsp;&nbsp; 191272k total,&nbsp;&nbsp; 173656k used,&nbsp;&nbsp;&nbsp; 17616k free,&nbsp;&nbsp;&nbsp;
            22052k buffers<br>
            Swap:&nbsp;&nbsp; 192772k total,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0k used,&nbsp;&nbsp; 192772k free,&nbsp;&nbsp;
            123988k cached<br>
            <br>
            &nbsp;&nbsp; PID USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PR&nbsp; NI&nbsp; VIRT&nbsp; RES&nbsp; SHR S %CPU %MEM&nbsp;&nbsp;&nbsp;
            TIME+&nbsp; COMMAND<br>
            &nbsp; 1379 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp; 0&nbsp; 7976 2456 1980 S&nbsp; 0.7&nbsp; 1.3&nbsp;&nbsp;
            0:11.03 sshd<br>
            14704 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp; 0&nbsp; 2128&nbsp; 980&nbsp; 796 R&nbsp; 0.7&nbsp; 0.5&nbsp;&nbsp; 0:02.72
            top<br>
            &nbsp;&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp; 0&nbsp; 1992&nbsp; 632&nbsp; 544 S&nbsp; 0.0&nbsp; 0.3&nbsp;&nbsp;
            0:00.90 init<br>
            &nbsp;&nbsp;&nbsp;&nbsp; 2 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34&nbsp; 19&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0 S&nbsp; 0.0&nbsp; 0.0&nbsp;&nbsp;
            0:00.00 ksoftirqd/0<br>
            &nbsp;&nbsp;&nbsp;&nbsp; 3 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RT&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0 S&nbsp; 0.0&nbsp; 0.0&nbsp;&nbsp;
            0:00.00 watchdog/0</td>
        </tr>
    </tbody>
</table>
<h4 id="content_1_1">统计信息区</h4>
<p>前五行是系统整体的统计信息。第一行是任务队列信息，同 uptime 命令的执行结果。其内容如下：</p>
<div class="ie5">
<table class="style_table" border="0" cellspacing="1">
    <tbody>
        <tr>
            <td class="style_td">01:06:48</td>
            <td class="style_td">当前时间</td>
        </tr>
        <tr>
            <td class="style_td">up 1:22</td>
            <td class="style_td">系统运行时间，格式为时:分</td>
        </tr>
        <tr>
            <td class="style_td">1 user</td>
            <td class="style_td">当前登录用户数</td>
        </tr>
        <tr>
            <td class="style_td">load average: 0.06, 0.60, 0.48</td>
            <td class="style_td">系统负载，即任务队列的平均长度。<br>
            三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。</td>
        </tr>
    </tbody>
</table>
</div>
<p>第二、三行为进程和CPU的信息。当有多个CPU时，这些内容可能会超过两行。内容如下：</p>
<div class="ie5">
<table class="style_table" border="0" cellspacing="1">
    <tbody>
        <tr>
            <td class="style_td">Tasks: 29 total</td>
            <td class="style_td">进程总数</td>
        </tr>
        <tr>
            <td class="style_td">1 running</td>
            <td class="style_td">正在运行的进程数</td>
        </tr>
        <tr>
            <td class="style_td">28 sleeping</td>
            <td class="style_td">睡眠的进程数</td>
        </tr>
        <tr>
            <td class="style_td">0 stopped</td>
            <td class="style_td">停止的进程数</td>
        </tr>
        <tr>
            <td class="style_td">0 zombie</td>
            <td class="style_td">僵尸进程数</td>
        </tr>
        <tr>
            <td class="style_td">Cpu(s): 0.3% us</td>
            <td class="style_td">用户空间占用CPU百分比</td>
        </tr>
        <tr>
            <td class="style_td">1.0% sy</td>
            <td class="style_td">内核空间占用CPU百分比</td>
        </tr>
        <tr>
            <td class="style_td">0.0% ni</td>
            <td class="style_td">用户进程空间内改变过优先级的进程占用CPU百分比</td>
        </tr>
        <tr>
            <td class="style_td">98.7% id</td>
            <td class="style_td">空闲CPU百分比</td>
        </tr>
        <tr>
            <td class="style_td">0.0% wa</td>
            <td class="style_td">等待输入输出的CPU时间百分比</td>
        </tr>
        <tr>
            <td class="style_td">0.0% hi</td>
            <td class="style_td">&nbsp;</td>
        </tr>
        <tr>
            <td class="style_td">0.0% si</td>
            <td class="style_td">&nbsp;</td>
        </tr>
    </tbody>
</table>
</div>
<p>最后两行为内存信息。内容如下：</p>
<div class="ie5">
<table class="style_table" border="0" cellspacing="1">
    <tbody>
        <tr>
            <td class="style_td">Mem: 191272k total</td>
            <td class="style_td">物理内存总量</td>
        </tr>
        <tr>
            <td class="style_td">173656k used</td>
            <td class="style_td">使用的物理内存总量</td>
        </tr>
        <tr>
            <td class="style_td">17616k free</td>
            <td class="style_td">空闲内存总量</td>
        </tr>
        <tr>
            <td class="style_td">22052k buffers</td>
            <td class="style_td">用作内核缓存的内存量</td>
        </tr>
        <tr>
            <td class="style_td">Swap: 192772k total</td>
            <td class="style_td">交换区总量</td>
        </tr>
        <tr>
            <td class="style_td">0k used</td>
            <td class="style_td">使用的交换区总量</td>
        </tr>
        <tr>
            <td class="style_td">192772k free</td>
            <td class="style_td">空闲交换区总量</td>
        </tr>
        <tr>
            <td class="style_td">123988k cached</td>
            <td class="style_td">缓冲的交换区总量。<br>
            内存中的内容被换出到交换区，而后又被换入到内存，但使用过的交换区尚未被覆盖，<br>
            该数值即为这些<strong>内容已存在于内存中</strong>的交换区的大小。<br>
            相应的内存再次被换出时可不必再对交换区写入。</td>
        </tr>
    </tbody>
</table>
</div>
<h4 id="content_1_2">进程信息区</h4>
<p>统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。</p>
<div class="ie5">
<table class="style_table" border="0" cellspacing="1">
    <thead>
        <tr>
            <td class="style_td">序号</td>
            <td class="style_td">列名</td>
            <td class="style_td">含义</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td class="style_td">a</td>
            <td class="style_td">PID</td>
            <td class="style_td">进程id</td>
        </tr>
        <tr>
            <td class="style_td">b</td>
            <td class="style_td">PPID</td>
            <td class="style_td">父进程id</td>
        </tr>
        <tr>
            <td class="style_td">c</td>
            <td class="style_td">RUSER</td>
            <td class="style_td">Real user name</td>
        </tr>
        <tr>
            <td class="style_td">d</td>
            <td class="style_td">UID</td>
            <td class="style_td">进程所有者的用户id</td>
        </tr>
        <tr>
            <td class="style_td">e</td>
            <td class="style_td">USER</td>
            <td class="style_td">进程所有者的用户名</td>
        </tr>
        <tr>
            <td class="style_td">f</td>
            <td class="style_td">GROUP</td>
            <td class="style_td">进程所有者的组名</td>
        </tr>
        <tr>
            <td class="style_td">g</td>
            <td class="style_td">TTY</td>
            <td class="style_td">启动进程的终端名。不是从终端启动的进程则显示为 ?</td>
        </tr>
        <tr>
            <td class="style_td">h</td>
            <td class="style_td">PR</td>
            <td class="style_td">优先级</td>
        </tr>
        <tr>
            <td class="style_td">i</td>
            <td class="style_td">NI</td>
            <td class="style_td">nice值。负值表示高优先级，正值表示低优先级</td>
        </tr>
        <tr>
            <td class="style_td">j</td>
            <td class="style_td">P</td>
            <td class="style_td">最后使用的CPU，仅在多CPU环境下有意义</td>
        </tr>
        <tr>
            <td class="style_td">k</td>
            <td class="style_td">%CPU</td>
            <td class="style_td">上次更新到现在的CPU时间占用百分比</td>
        </tr>
        <tr>
            <td class="style_td">l</td>
            <td class="style_td">TIME</td>
            <td class="style_td">进程使用的CPU时间总计，单位秒</td>
        </tr>
        <tr>
            <td class="style_td">m</td>
            <td class="style_td">TIME+</td>
            <td class="style_td">进程使用的CPU时间总计，单位1/100秒</td>
        </tr>
        <tr>
            <td class="style_td">n</td>
            <td class="style_td">%MEM</td>
            <td class="style_td">进程使用的<strong>物理内存</strong>百分比</td>
        </tr>
        <tr>
            <td class="style_td">o</td>
            <td class="style_td">VIRT</td>
            <td class="style_td">进程使用的虚拟内存总量，单位kb。VIRT=SWAP+RES</td>
        </tr>
        <tr>
            <td class="style_td">p</td>
            <td class="style_td">SWAP</td>
            <td class="style_td">进程使用的虚拟内存中，被换出的大小，单位kb。</td>
        </tr>
        <tr>
            <td class="style_td">q</td>
            <td class="style_td">RES</td>
            <td class="style_td">进程使用的、未被换出的物理内存大小，单位kb。RES=CODE+DATA</td>
        </tr>
        <tr>
            <td class="style_td">r</td>
            <td class="style_td">CODE</td>
            <td class="style_td">可执行代码占用的<strong>物理</strong>内存大小，单位kb</td>
        </tr>
        <tr>
            <td class="style_td">s</td>
            <td class="style_td">DATA</td>
            <td class="style_td">可执行代码以外的部分(数据段+栈)占用的<strong>物理</strong>内
            存大小，单位kb</td>
        </tr>
        <tr>
            <td class="style_td">t</td>
            <td class="style_td">SHR</td>
            <td class="style_td">共享内存大小，单位kb</td>
        </tr>
        <tr>
            <td class="style_td">u</td>
            <td class="style_td">nFLT</td>
            <td class="style_td">页面错误次数</td>
        </tr>
        <tr>
            <td class="style_td">v</td>
            <td class="style_td">nDRT</td>
            <td class="style_td">最后一次写入到现在，被修改过的页面数。</td>
        </tr>
        <tr>
            <td class="style_td">w</td>
            <td class="style_td">S</td>
            <td class="style_td">进程状态。<br>
            <strong>D</strong>=不可中断的睡眠状态<br>
            <strong>R</strong>=运行<br>
            <strong>S</strong>=睡眠<br>
            <strong>T</strong>=跟踪/停止<br>
            <strong>Z</strong>=僵尸进程</td>
        </tr>
        <tr>
            <td class="style_td">x</td>
            <td class="style_td">COMMAND</td>
            <td class="style_td">命令名/命令行</td>
        </tr>
        <tr>
            <td class="style_td">y</td>
            <td class="style_td">WCHAN</td>
            <td class="style_td">若该进程在睡眠，则显示睡眠中的系统函数名</td>
        </tr>
        <tr>
            <td class="style_td">z</td>
            <td class="style_td">Flags</td>
            <td class="style_td">任务标志，参考 sched.h</td>
        </tr>
    </tbody>
</table>
</div>
<p>默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND
列。可以通过下面的快捷键来更改显示内容。</p>
<h3 id="content_1_3">更改显示内容</h3>
<p>通过 <strong>f </strong>键可以选择显示的内容。按 f 键之后会显示列的列表，按 a-z
即可显示或隐藏对应的列，最后按回车键确定。</p>
<p>按 <strong>o</strong> 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动，而大写的 A-Z
可以将相应的列向左移动。最后按回车键确定。</p>
<p>按大写的 <strong>F</strong> 或 <strong>O</strong> 键，然后按 a-z
可以将进程按照相应的列进行排序。而大写的 <strong>R</strong> 键可以将当前的排序倒转。</p>
<p><font size="4"><strong>命令使用</strong></font></p>
<p><span class="style6">1． 工具（命令）名称<br>
top<br>
2．工具（命令）作用<br>
显示系统当前的进程和其他状况；
top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.
比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最&#8220;敏感&#8221;的任务列表.该命令可以按CPU使用.内存使用和执行时间
对任务进行排序；而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定. <br>
3．环境设置<br>
在Linux下使用。<br>
4．使用方法<br>
4．1使用格式<br>
top [-] [d] [p] [q] [c] [C] [S] [s]&nbsp; [n] <br>
4．2参数说明<br>
&nbsp;<font color="#ff0000">d </font>指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。<br>
<font color="#ff0000">&nbsp;p</font> 通过指定监控进程ID来仅仅监控某个进程的状态。<br>
&nbsp;<font color="#ff0000">q</font>该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限，那么top将以
尽可能高的优先级运行。<br>
<font color="#ff0000">&nbsp;S</font> 指定累计模式<br>
<font color="#ff0000">&nbsp;s</font> 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。<br>
<font color="#ff0000">&nbsp;i</font>&nbsp; 使top不显示任何闲置或者僵死进程。<br>
<font color="#ff0000">&nbsp;c</font>&nbsp; 显示整个命令行而不只是显示命令名<br>
4.3其他<br>
下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看，熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的，如果在命
令行选项中使用了s选项，则可能其中一些命令会被屏蔽掉。<br>
<font color="#ff0000">Ctrl+L</font> 擦除并且重写屏幕。<br>
<font color="#ff0000">h或者?</font> 显示帮助画面，给出一些简短的命令总结说明。<br>
<font color="#ff0000">k</font>
终止一个进程。系统将提示用户输入需要终止的进程PID，以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号；如果不能正常结束那就使用
信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。<br>
<font color="#ff0000">i </font>忽略闲置和僵死进程。这是一个开关式命令。<br>
<font color="#ff0000">q </font>退出程序。<br>
<font color="#ff0000">r </font>重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的
进程优先级值。输入一个正值将使优先级降低，反之则可以使该进程拥有更高的优先权。默认值是10。<br>
<font color="#ff0000">S </font>切换到累计模式。<br>
<font color="#ff0000">s </font>改变两次刷新之间的延迟时间。系统将提示用户输入新的时间，单位为s。如果有小数，
就换算成m s。输入0值则系统将不断刷新，默认值是5
s。需要注意的是如果设置太小的时间，很可能会引起不断刷新，从而根本来不及看清显示的情况，而且系统负载也会大大增加。<br>
<font color="#ff0000">f或者F</font> 从当前显示中添加或者删除项目。<br>
<font color="#ff0000">o或者O</font> 改变显示项目的顺序。<br>
<font color="#ff0000">l </font>切换显示平均负载和启动时间信息。<br>
<font color="#ff0000">m</font> 切换显示内存信息。<br>
<font color="#ff0000">t </font>切换显示进程和CPU状态信息。<br>
<font color="#ff0000">c </font>切换显示命令名称和完整命令行。<br>
<font color="#ff0000">　M</font> 根据驻留内存大小进行排序。<br>
<font color="#ff0000">P </font>根据CPU使用百分比大小进行排序。<br>
<font color="#ff0000">T</font> 根据时间/累计时间进行排序。<br>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;W</font> 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。</span></p>
<br><br> <img src ="http://www.cppblog.com/bujiwu/aggbug/113700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2010-04-27 13:26 <a href="http://www.cppblog.com/bujiwu/archive/2010/04/27/top.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]C函数atoi的实现</title><link>http://www.cppblog.com/bujiwu/archive/2010/01/15/atoi.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Fri, 15 Jan 2010 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2010/01/15/atoi.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/105772.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2010/01/15/atoi.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/105772.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/105772.html</trackback:ping><description><![CDATA[转载链接:<a  href="http://blog.chinaunix.net/u2/76292/showart_1845022.html">http://blog.chinaunix.net/u2/76292/showart_1845022.html</a><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#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></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<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></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ctype.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;my_atol(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">nptr)<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;c;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;current&nbsp;char&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;total;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;current&nbsp;total&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sign;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;if&nbsp;'-',&nbsp;then&nbsp;negative,&nbsp;otherwise&nbsp;positive&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;skip&nbsp;whitespace&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;isspace((</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">nptr)&nbsp;)<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">nptr;<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">nptr</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;save&nbsp;sign&nbsp;indication&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(c&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;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;c&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></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">nptr</span><span style="color: #000000;">++</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;skip&nbsp;sign&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;total&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: #008080;">25</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(isdigit(c))&nbsp;<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;total&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(c&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;">);&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;accumulate&nbsp;digit&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">nptr</span><span style="color: #000000;">++</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;get&nbsp;next&nbsp;char&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(sign&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></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&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;">total;<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;total;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;return&nbsp;result,&nbsp;negated&nbsp;if&nbsp;necessary&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&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;">*</span><span style="color: #000000;">&nbsp;argv[])<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;argc&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;)<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&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></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&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;my_atol(argv[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br></span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">[%s]====&gt;[%d]\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;argv[</span><span style="color: #000000;">1</span><span style="color: #000000;">],&nbsp;i);<br></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;atoi(argv[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br></span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">[%s]====&gt;[%d]\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;argv[</span><span style="color: #000000;">1</span><span style="color: #000000;">],&nbsp;j);<br></span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&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><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;"></span></div>
<a  href="http://www.cppblog.com/Files/bujiwu/atoi.rar">http://www.cppblog.com/Files/bujiwu/atoi.rar</a><br><br><img src ="http://www.cppblog.com/bujiwu/aggbug/105772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2010-01-15 17:52 <a href="http://www.cppblog.com/bujiwu/archive/2010/01/15/atoi.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix Network Programming - Vol2 读书笔记(Chapter 9. Record Locking)</title><link>http://www.cppblog.com/bujiwu/archive/2009/12/18/103474.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Fri, 18 Dec 2009 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/12/18/103474.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/103474.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/12/18/103474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/103474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/103474.html</trackback:ping><description><![CDATA[使用Record Locking只启动一个进程实例。通过记录锁锁文件方式实现。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">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;">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;">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: #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;"><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><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;FILE_PATH&nbsp;&nbsp;&nbsp;"LockFile.txt"</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;MAXLINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4096&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;max&nbsp;text&nbsp;line&nbsp;length&nbsp;*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;FILE_MODE&nbsp;&nbsp;&nbsp;(S_IRUSR&nbsp;|&nbsp;S_IWUSR&nbsp;|&nbsp;S_IRGRP&nbsp;|&nbsp;S_IROTH)</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;LockSet(</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;Type)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;flock&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;F_RDLCK,&nbsp;F_WRLCK,&nbsp;F_UNLCK&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;byte&nbsp;offset,&nbsp;relative&nbsp;to&nbsp;l_whence&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_whence&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SEEK_END;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;SEEK_SET,&nbsp;SEEK_CUR,&nbsp;SEEK_END&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">.l_len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;#bytes&nbsp;(0&nbsp;means&nbsp;to&nbsp;EOF)&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fcntl(&nbsp;fd,&nbsp;F_SETLK,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #0000ff;">lock</span><span style="color: #000000;">);<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,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;line[MAXLINE]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br><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;open(FILE_PATH,&nbsp;O_RDWR&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;O_CREAT</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;O_APPEND&nbsp;,&nbsp;FILE_MODE);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;LockSet(fd,&nbsp;F_WRLCK)&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;">if</span><span style="color: #000000;">&nbsp;(errno&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;EACCES&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;errno&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;EAGAIN)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">This&nbsp;program&nbsp;has&nbsp;running!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">call&nbsp;fcntl&nbsp;function&nbsp;error.%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">lock&nbsp;file&nbsp;[%s]&nbsp;successful<img src="http://www.cppblog.com/Images/dot.gif">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;FILE_PATH);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;snprintf(line,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(line),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">)&nbsp;getpid());<br><br>&nbsp;&nbsp;&nbsp;&nbsp;lseek(fd,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;SEEK_END);<br>&nbsp;&nbsp;&nbsp;&nbsp;write(fd,&nbsp;line,&nbsp;strlen(line));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;LockSet(fd,&nbsp;F_UNLCK)&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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">call&nbsp;fcntl&nbsp;function&nbsp;error.%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br><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>
<a  href="http://www.cppblog.com/Files/bujiwu/RecordLocking.rar">http://www.cppblog.com/Files/bujiwu/RecordLocking.rar</a><br><br><img src ="http://www.cppblog.com/bujiwu/aggbug/103474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-12-18 15:57 <a href="http://www.cppblog.com/bujiwu/archive/2009/12/18/103474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::filestream组件封装</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/23/101692.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Mon, 23 Nov 2009 05:44:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/23/101692.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/101692.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/23/101692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/101692.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/101692.html</trackback:ping><description><![CDATA[为了方便日常使用boost::filestream组件，将boost::filestream组件的基本封装。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;<br>&nbsp;*&nbsp;@file&nbsp;FileSystem.h<br>&nbsp;*&nbsp;@brief&nbsp;Operation&nbsp;file&nbsp;or&nbsp;diretory<br>&nbsp;*&nbsp;@author&nbsp;Jiwu&nbsp;Bu<br>&nbsp;*&nbsp;@version&nbsp;1.0.0<br>&nbsp;*&nbsp;@date&nbsp;2009-11-23<br>&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>#ifndef&nbsp;FILESYSTEM_H_H<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;FILESYSTEM_H_H</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;">vector</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;">class</span><span style="color: #000000;">&nbsp;CFileSystem<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Gets&nbsp;an&nbsp;array&nbsp;of&nbsp;dirctories&nbsp;from&nbsp;current&nbsp;direcoty,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;Recur&nbsp;value&nbsp;to&nbsp;determine&nbsp;whether&nbsp;to&nbsp;search&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subdirectories.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;SubDirVec&nbsp;Ouput&nbsp;parameter,&nbsp;return&nbsp;the&nbsp;search&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;DirPath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Recur&nbsp;&nbsp;Whether&nbsp;search&nbsp;subdirectories.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;GetDirectories(vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;SubDirVec,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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;DirPath,&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Recur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Get&nbsp;the&nbsp;names&nbsp;of&nbsp;files&nbsp;in&nbsp;the&nbsp;specified&nbsp;directory&nbsp;that&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;the&nbsp;specified&nbsp;extensive&nbsp;name,&nbsp;using&nbsp;a&nbsp;value&nbsp;to&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;determine&nbsp;whether&nbsp;to&nbsp;search&nbsp;subdirectories.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;FileVec&nbsp;Ouput&nbsp;parameter,&nbsp;return&nbsp;the&nbsp;search&nbsp;result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;DirPath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;ExeName&nbsp;Extensive&nbsp;name,&nbsp;if&nbsp;ExeName&nbsp;equal&nbsp;&nbsp;"*.*"&nbsp;&nbsp;search&nbsp;all&nbsp;file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Recur&nbsp;&nbsp;&nbsp;Whether&nbsp;search&nbsp;subdirectories<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;GetFiles(vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;&amp;</span><span style="color: #000000;">&nbsp;FileVec,&nbsp;</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;DirPath,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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;ExeName,&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Recur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Create&nbsp;a&nbsp;new&nbsp;directory.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Dir&nbsp;&nbsp;New&nbsp;directory&nbsp;path.&nbsp;Example:/home/bujiwu/test<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;&nbsp;true,&nbsp;if&nbsp;success<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;if&nbsp;failed<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;CreateDirectory(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;Dir);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Judge&nbsp;whether&nbsp;this&nbsp;file&nbsp;or&nbsp;diretory&nbsp;exists.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Path<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;&nbsp;true,&nbsp;if&nbsp;exists<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false,&nbsp;if&nbsp;not&nbsp;exists<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Exists(</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;Path);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Delete&nbsp;this&nbsp;file&nbsp;or&nbsp;directory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;Path<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Delete(</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;Path);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Move&nbsp;file&nbsp;or&nbsp;directory&nbsp;from&nbsp;FromPath&nbsp;to&nbsp;ToPath.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;FromPath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;ToPath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Move(</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;FromPath,&nbsp;</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;ToPath);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Copy&nbsp;file&nbsp;or&nbsp;directory&nbsp;from&nbsp;FromPath&nbsp;to&nbsp;ToPath.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;FromPath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;ToPath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Copy(</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;FromPath,&nbsp;</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;ToPath);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@brief&nbsp;Get&nbsp;file&nbsp;size<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;FilePath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;GetFileSize(</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;FilePath);<br>};<br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br></span></div>
<br>测试用例：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">../FileSystem/FileSystem.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;">algorithm</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;">iterator</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><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;">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;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;MyVec;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;Path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/bujiwu/EncapDirectory</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;CFileSystem::Copy(</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/bujiwu/epoll</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Path);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;CFileSystem::GetFiles(MyVec,&nbsp;Path,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">*.*</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;copy(MyVec.begin(),&nbsp;MyVec.end(),&nbsp;ostream_iterator</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(cout&nbsp;,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;);<br><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>
<br><a  href="http://www.cppblog.com/Files/bujiwu/FileSystem.rar">http://www.cppblog.com/Files/bujiwu/FileSystem.rar</a><br><br><img src ="http://www.cppblog.com/bujiwu/aggbug/101692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-11-23 13:44 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/23/101692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux与Winodws下编译boost</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/23/101689.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Mon, 23 Nov 2009 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/23/101689.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/101689.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/23/101689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/101689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/101689.html</trackback:ping><description><![CDATA[需要编译的库：<br>date_time<br>filesystem<br>function_types<br>graph<br>iostreams<br>math<br>mpi<br>program_options<br>python<br>regex<br>serialization<br>signals<br>system<br>test<br>thread<br>wave<br><br><br>Windows:<br>1、开始菜单--Microsoft Visual Studio 2008--Visual Studio Tools---Open Visual Studio 2008 Command Prompt 打开命令行窗口<br>3、利用cd命令进入到：boost-&gt;toos-&gt;jam-&gt;src目录<br>4、编译，vc 2008输入命令：build vc9<br>5、把生成的bjam.exe(bin.ntx86目录下)拷贝到Boost根目录下，输入命令：<br>6、bjam --with-regex<br><br>Linux:<br>&nbsp;$cd path/to/boost_1_40_0<br>&nbsp;$ ./bootstrap.sh<br>&nbsp;产生bjam文件<br>&nbsp; <br>&nbsp;$ ./bjam install&nbsp; 安装所有<br>&nbsp;$./bjam --with-regex&nbsp; 安装特定的库<br>&nbsp;$./bjam --with-filesystem<br><br>&nbsp;#./bjam --with-filesystem "-sTOOLS=gcc" "--includedir=/usr/include" "--libdir=/usr/lib/boost" install<br><br> <img src ="http://www.cppblog.com/bujiwu/aggbug/101689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-11-23 13:31 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/23/101689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>semaphore信号学习笔记</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/17/101190.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Tue, 17 Nov 2009 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/17/101190.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/101190.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/17/101190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/101190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/101190.html</trackback:ping><description><![CDATA[使用信号量sem_t实现生产者与消费者实例。主要用到以下几个函数:<br>sem_init()<br>sem_destroy()<br>sem_post() <br>sem_wait()<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">g++&nbsp;-o&nbsp;semaphore&nbsp;semaphore.cpp&nbsp;&nbsp;-lpthread</span><span style="color: #008000;"><br></span><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">semaphore.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;">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;">pthread.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;">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;">"</span><span style="color: #000000;">ThreadMutex.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;MAXSIZE&nbsp;10</span><span style="color: #000000;"><br><br>sem_t&nbsp;g_sem_max;<br>sem_t&nbsp;g_sem_zero;<br><br>CThreadMutex&nbsp;g_mutex;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;g_count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sem_wait_i(sem_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;psem)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;rv&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;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;(&nbsp;rv&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sem_wait(psem)&nbsp;)&nbsp;)<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;(&nbsp;errno&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;EINTR&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: #0000ff;">continue</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;">else</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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">sem_wait&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&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><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;rv;<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;producer_thread(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Parameter)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;sem_wait_i(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_max)&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;{<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><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_mutex.Lock();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Producer=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;g_count);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_post(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_zero);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_mutex.UnLock();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;NULL;<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;consumer_thread(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Parameter)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;sem_wait_i(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_zero)&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;{<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><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_mutex.Lock();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_count</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Consumer=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;g_count);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_post(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_max);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_mutex.UnLock();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;NULL;<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,&nbsp;</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;">if</span><span style="color: #000000;">&nbsp;(&nbsp;sem_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_zero,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&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;">0</span><span style="color: #000000;">&nbsp;)<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;">sem_init&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;(&nbsp;sem_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_max,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;MAXSIZE)&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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">sem_init&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;pthread_t&nbsp;pro_thread;<br>&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;sum_thread;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;pthread_create(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">sum_thread,&nbsp;NULL,&nbsp;consumer_thread,&nbsp;NULL)&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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">pthread_create%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;(&nbsp;pthread_create(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pro_thread,&nbsp;NULL,&nbsp;producer_thread,&nbsp;NULL)&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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">pthread_create%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;pthread_join(pro_thread,&nbsp;NULL)&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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">pthread_join&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;(&nbsp;pthread_join(sum_thread,&nbsp;NULL)&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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">pthread_join&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;sem_destroy(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_zero);<br>&nbsp;&nbsp;&nbsp;&nbsp;sem_destroy(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_sem_max);<br><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>
<a  href="http://www.cppblog.com/Files/bujiwu/semaphore.rar">http://www.cppblog.com/Files/bujiwu/semaphore.rar</a><br><br> <img src ="http://www.cppblog.com/bujiwu/aggbug/101190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-11-17 13:28 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/17/101190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>setitimer函数使用笔记</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/16/101061.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Mon, 16 Nov 2009 05:50:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/16/101061.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/101061.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/16/101061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/101061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/101061.html</trackback:ping><description><![CDATA[<fieldset><legend>函数原型</legend> int setitimer(int which, const struct itimerval *value,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct itimerval *ovalue);<br><br>DESCRIPTION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The&nbsp; system&nbsp; provides each process with three interval timers, each decrementing in a distinct time domain.&nbsp; When any timer expires, a<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signal is sent to the process, and the timer (potentially) restarts.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITIMER_REAL&nbsp;&nbsp;&nbsp; decrements in real time, and delivers SIGALRM upon expiration.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITIMER_VIRTUAL decrements only when the process is executing, and delivers SIGVTALRM upon expiration.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITIMER_PROF&nbsp;&nbsp;&nbsp; decrements both when the process executes and when the system is executing on behalf&nbsp; of&nbsp; the&nbsp; process.&nbsp;&nbsp; Coupled&nbsp; with<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITIMER_VIRTUAL, this timer is usually used to profile the time spent by the application in user and kernel space.&nbsp; SIG-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROF is delivered upon expiration.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer values are defined by the following structures:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct itimerval {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct timeval it_interval; /* next value */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct timeval it_value;&nbsp;&nbsp;&nbsp; /* current value */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct timeval {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long tv_sec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* seconds */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long tv_usec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* microseconds */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br></fieldset><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">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;">signal.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;">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;">errno.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PrintMsg(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Num)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;World</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<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,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGALRM,&nbsp;PrintMsg);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;itimerval&nbsp;tick;<br>&nbsp;&nbsp;&nbsp;&nbsp;tick.it_value.tv_sec&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&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;tick.it_value.tv_usec&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;tick.it_interval.tv_sec&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定时器启动后，每隔1秒将执行相应的函数</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;tick.it_interval.tv_usec&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">setitimer将触发SIGALRM信号</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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;setitimer(ITIMER_REAL,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tick,&nbsp;NULL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Set&nbsp;timer&nbsp;error.&nbsp;%s&nbsp;\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br><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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Wait!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><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>
<br><img src ="http://www.cppblog.com/bujiwu/aggbug/101061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-11-16 13:50 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/16/101061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pthread_mutex_t封装</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/08/pthread_mutex.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 08 Nov 2009 12:57:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/08/pthread_mutex.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/100413.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/08/pthread_mutex.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/100413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/100413.html</trackback:ping><description><![CDATA[常常需要使用pthread_mutex线程同步，每次都要使用pthread_mutex_init, pthread_mutex_lock, pthread_unlock, pthread_mutex_destroy这几个函数，干脆封装一下，以便以后重用。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">//Mutex.cpp<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>#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></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;">class</span><span style="color: #000000;">&nbsp;ThreadMutex<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;ThreadMutex()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mtx,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">ThreadMutex()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_destroy(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mtx&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Lock()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mtx&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;UnLock()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mtx&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_t&nbsp;mtx;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>//以下为测试用例<br>ThreadMutex&nbsp;g_Mutex;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">PrintMsg(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">lpPara)<br>{<br>&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;">msg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)lpPara;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;g_Mutex.Lock();<br><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</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;msg&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;g_Mutex.UnLock();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;NULL;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;t1,t2;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建两个工作线程，第1个线程打印10个1，第2个线程打印10个2。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t1,&nbsp;NULL,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">PrintMsg,&nbsp;(</span><span style="color: #0000ff;">void</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;">First&nbsp;print&nbsp;thread</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t2,&nbsp;NULL,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">PrintMsg,&nbsp;(</span><span style="color: #0000ff;">void</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;">Second&nbsp;print&nbsp;thread</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">等待线程结束&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(&nbsp;t1,&nbsp;NULL);&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;<br>&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(&nbsp;t2,&nbsp;NULL);&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;<br><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;">;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>}&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<br>通过g++ -o Mutex Mutex.cpp -lpthread编译。<br><img src ="http://www.cppblog.com/bujiwu/aggbug/100413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-11-08 20:57 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/08/pthread_mutex.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间通讯--System V 共享内存</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/08/100390.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 08 Nov 2009 01:39:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/08/100390.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/100390.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/08/100390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/100390.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/100390.html</trackback:ping><description><![CDATA[进程一将数据写入共享内存，进程二从共享内存读取数据<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">ipc.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;">shm.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;">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>#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;"><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><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;">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;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;key_t&nbsp;key&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ftok(</span><span style="color: #000000;">"</span><span style="color: #000000;">/etc/passwd</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;">);<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;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;key&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Creat&nbsp;Key&nbsp;Error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno));<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;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;your&nbsp;IPC&nbsp;are&nbsp;used&nbsp;by&nbsp;processes&nbsp;related&nbsp;bya&nbsp;fork()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;(parent-children-grandchildren<img src="http://www.cppblog.com/Images/dot.gif">)&nbsp;use&nbsp;IPC_PRIVATE&nbsp;as&nbsp;the&nbsp;key<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shm_id</span><span style="color: #000000;">=</span><span style="color: #000000;">shmget(&nbsp;key,&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">,&nbsp;IPC_CREAT&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">0660</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;shm_id&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;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;shmctl(shm_id,&nbsp;IPC_RMID,&nbsp;NULL)&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">shmctl&nbsp;remove&nbsp;shmid&nbsp;error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno&nbsp;));<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><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_id</span><span style="color: #000000;">=</span><span style="color: #000000;">shmget(&nbsp;key,&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">,&nbsp;IPC_CREAT&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">0660</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;shm_id&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">shmget&nbsp;create&nbsp;error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<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;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)shmat(shm_id,&nbsp;NULL,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)pMap&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">shmat&nbsp;create&nbsp;error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shm_id,&nbsp;IPC_RMID,&nbsp;NULL);<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;strcpy(&nbsp;pMap,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Bujiwu&nbsp;Swallow</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;shmdt(pMap);<br>&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shm_id,&nbsp;IPC_RMID,&nbsp;NULL);<br><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: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">ipc.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;">shm.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;">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>#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;"><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><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;">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;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;key_t&nbsp;key&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ftok(</span><span style="color: #000000;">"</span><span style="color: #000000;">/etc/passwd</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;">);<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;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;key&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Creat&nbsp;Key&nbsp;Error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno));<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;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;your&nbsp;IPC&nbsp;are&nbsp;used&nbsp;by&nbsp;processes&nbsp;related&nbsp;bya&nbsp;fork()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;(parent-children-grandchildren<img src="http://www.cppblog.com/Images/dot.gif">)&nbsp;use&nbsp;IPC_PRIVATE&nbsp;as&nbsp;the&nbsp;key<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;shm_id</span><span style="color: #000000;">=</span><span style="color: #000000;">shmget(&nbsp;key,&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">,&nbsp;IPC_CREAT</span><span style="color: #000000;">|</span><span style="color: #000000;">0660</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;shm_id&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;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;shmctl(shm_id,&nbsp;IPC_RMID,&nbsp;NULL)&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">shmctl&nbsp;remove&nbsp;shmid&nbsp;error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno&nbsp;));<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><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shm_id</span><span style="color: #000000;">=</span><span style="color: #000000;">shmget(&nbsp;key,&nbsp;</span><span style="color: #000000;">1024</span><span style="color: #000000;">,&nbsp;IPC_CREAT&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">0660</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;shm_id&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">shmget&nbsp;create&nbsp;error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)shmat(shm_id,&nbsp;NULL,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)pMap&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">shmat&nbsp;create&nbsp;error:%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shm_id,&nbsp;IPC_RMID,&nbsp;NULL);<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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Shared&nbsp;&nbsp;memory::%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;pMap);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;shmdt(pMap);<br>&nbsp;&nbsp;&nbsp;&nbsp;shmctl(shm_id,&nbsp;IPC_RMID,&nbsp;NULL);<br><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>
<br><a href="http://www.cppblog.com/Files/bujiwu/ShareMemory.rar">http://www.cppblog.com/Files/bujiwu/ShareMemory.rar</a><br>   <img src ="http://www.cppblog.com/bujiwu/aggbug/100390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bujiwu/" target="_blank">bujiwu</a> 2009-11-08 09:39 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/08/100390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>