﻿<?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-随笔分类-Linux</title><link>http://www.cppblog.com/bujiwu/category/9219.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 Apr 2010 16:39:51 GMT</lastBuildDate><pubDate>Thu, 29 Apr 2010 16:39:51 GMT</pubDate><ttl>60</ttl><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>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>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><item><title>进程间通讯--System V 消息队列</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/07/100356.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sat, 07 Nov 2009 13:47:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/07/100356.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/100356.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/07/100356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/100356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/100356.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 参考文章:http://blog.chinaunix.net/u1/53810/showart_425856.html1．创建消息队列int msgget(key_t key, int msgflg);通常是msgflg =IPC_CREAT| IPC_EXCL|0666通过key_t ftok(const char *pathname, int proj_id);创建key_t2．队列读写ssi...&nbsp;&nbsp;<a href='http://www.cppblog.com/bujiwu/archive/2009/11/07/100356.html'>阅读全文</a><img src ="http://www.cppblog.com/bujiwu/aggbug/100356.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-07 21:47 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/07/100356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载:什么是Core Dump</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/05/100204.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Thu, 05 Nov 2009 05:12:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/05/100204.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/100204.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/05/100204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/100204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/100204.html</trackback:ping><description><![CDATA[转载地址:<a href="http://blog.chinaunix.net/u/16292/showart_1844400.html"> http://blog.chinaunix.net/u/16292/showart_1844400.html</a><br><br>1、什么是Core Dump?<br>Core的意思是内存, Dump的意思是扔出来, 堆出来.<br>开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.<br>core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.<br><br>2、如何使用core文件?<br>gdb -c core文件路径 [应用程序的路径]<br>进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.<br><br>3、为什么没有core文件生成呢?<br>有时候程序down了, 但是core文件却没有生成. core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.<br>ulimit -c unlimited<br>core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号<br><br>4、用gdb查看core文件:<br>下面我们可以在发生运行时信号引起的错误时发生core dump了.<br>发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.<br>gdb [exec file] [core file]<br>如:<br>gdb ./test test.core<br>在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件-&gt;行.<br>  <img src ="http://www.cppblog.com/bujiwu/aggbug/100204.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-05 13:12 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/05/100204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建守护进程函数</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/01/99952.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 01 Nov 2009 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/01/99952.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/99952.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/01/99952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/99952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/99952.html</trackback:ping><description><![CDATA[<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: #0000ff;">void</span><span style="color: #000000;">&nbsp;DaemonInit(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;<br>&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;sid;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;fork&nbsp;to&nbsp;leave&nbsp;parent</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fork&nbsp;();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(pid&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">failed&nbsp;to&nbsp;fork!</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(pid&nbsp;</span><span style="color: #000000;">&gt;</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: #008000;">//</span><span style="color: #008000;">parent&nbsp;process&nbsp;go&nbsp;to&nbsp;exit</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(EXIT_SUCCESS);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">child&nbsp;process&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;setsid&nbsp;();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(sid&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;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Failed&nbsp;to&nbsp;set&nbsp;session&nbsp;id.</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(EXIT_FAILURE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>}<br></span></div>
<br> <img src ="http://www.cppblog.com/bujiwu/aggbug/99952.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-01 22:15 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/01/99952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux与Windows中map类erase方法的差异</title><link>http://www.cppblog.com/bujiwu/archive/2009/11/01/map.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 01 Nov 2009 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/11/01/map.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/99928.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/11/01/map.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/99928.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/99928.html</trackback:ping><description><![CDATA[<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;">iostream</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;">map</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: #0000ff;">string</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;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;&nbsp;std;<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;"></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></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;MyMap;<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;MyMap[</span><span style="color: #000000;">"</span><span style="color: #000000;">bujiwu</span><span style="color: #000000;">"</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">26</span><span style="color: #000000;">;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;MyMap[</span><span style="color: #000000;">"</span><span style="color: #000000;">swallow</span><span style="color: #000000;">"</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">25</span><span style="color: #000000;">;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">Before&nbsp;delete&nbsp;element:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(&nbsp;map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::iterator&nbsp;Itor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MyMap.begin();<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Itor&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;MyMap.end();&nbsp;Itor</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;Itor</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">first&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;Itor</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">second&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(&nbsp;map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::iterator&nbsp;Itor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MyMap.begin();<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Itor&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;MyMap.end();&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;Itor</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">first&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">bujiwu</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyMap.erase(Itor</span><span style="color: #000000;">++</span><span style="color: #000000;">); <span style="color: red;">//在windows下也可以Itor = MyMap.erase(Itor),但是在linux下不行。</span><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&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;</span><span style="color: #0000ff;">else</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;{<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Itor</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">After&nbsp;delete&nbsp;element:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(&nbsp;map</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::iterator&nbsp;Itor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MyMap.begin();<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Itor&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;MyMap.end();&nbsp;Itor</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)<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;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;Itor</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">first&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;Itor</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">second&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<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;">&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;">42</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;"></span><span style="color: #000000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;"></span></div>
<br>通过测试在不管在linux还是Windows平台下,vector,list都有方法<strong>iterator erase(</strong>
<strong>   iterator </strong>_Where
<strong>);</strong>
<br>但是在Linux下map中没有方法<strong>iterator erase(</strong>
<strong>   iterator </strong>_Where
<strong>);</strong>
所以上述代码在Linux平台下第26行必须写成MyMap.erase(Itor++),而不能写能Itor = MyMap.erase(Itor). 在Windows下二种方法都可以。<br><br> <img src ="http://www.cppblog.com/bujiwu/aggbug/99928.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-01 10:40 <a href="http://www.cppblog.com/bujiwu/archive/2009/11/01/map.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fork学习笔记</title><link>http://www.cppblog.com/bujiwu/archive/2009/09/13/96062.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 13 Sep 2009 12:25:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/09/13/96062.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/96062.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/09/13/96062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/96062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/96062.html</trackback:ping><description><![CDATA[<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;">unistd.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;">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></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;">stdio.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;">#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></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">#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></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;"></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></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;my_pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getpid();<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;parent_pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getppid();<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ProcessID&nbsp;=%ld&nbsp;&nbsp;ParentID&nbsp;=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;my_pid,&nbsp;parent_pid);<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;child&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fork();<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">-------------------------------------\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Fork&nbsp;Process&nbsp;ID&nbsp;=&nbsp;%ld&nbsp;\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;child&nbsp;);<br></span><span style="color: #008080;">18</span>&nbsp;<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;">switch</span><span style="color: #000000;">(&nbsp;child&nbsp;)<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;</span><span style="color: #0000ff;">case</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;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Create&nbsp;my&nbsp;child&nbsp;process&nbsp;error&nbsp;by&nbsp;fork&nbsp;func,&nbsp;errno=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;strerror(errno)&nbsp;);<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">:<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">This&nbsp;is&nbsp;child&nbsp;process!&nbsp;Process&nbsp;ID&nbsp;=&nbsp;%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;getpid()&nbsp;);<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #008080;">28</span>&nbsp;<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;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">This&nbsp;is&nbsp;not&nbsp;child&nbsp;process!&nbsp;Process&nbsp;ID=&nbsp;%ld&nbsp;Child&nbsp;Process&nbsp;ID=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;getpid(),&nbsp;child);<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">who&nbsp;am&nbsp;I?&nbsp;Process&nbsp;ID=%ld&nbsp;&nbsp;Parent&nbsp;Process&nbsp;ID=&nbsp;%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;getpid(),&nbsp;getppid());<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">36</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;">37</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;"></span></div>
<br><fieldset><legend>运行结果</legend>[swallow@localhost syspr]$ ./process<br>ProcessID =1182&nbsp; ParentID =1090<br>-------------------------------------<br>Fork Process ID = 0<br>This is child process! Process ID = 1183<br>who am I? Process ID=1183&nbsp; Parent Process ID= 1182<br>-------------------------------------<br>Fork Process ID = 1183<br>This is not child process! Process ID= 1182 Child Process ID=1183<br>who am I? Process ID=1182&nbsp; Parent Process ID= 1090<br>[swallow@localhost syspr]$<br></fieldset><br><a href="http://www.cppblog.com/Files/bujiwu/fork.rar">http://www.cppblog.com/Files/bujiwu/fork.rar</a><br><br> <img src ="http://www.cppblog.com/bujiwu/aggbug/96062.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-09-13 20:25 <a href="http://www.cppblog.com/bujiwu/archive/2009/09/13/96062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量</title><link>http://www.cppblog.com/bujiwu/archive/2009/01/25/72575.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 25 Jan 2009 10:20:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/01/25/72575.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/72575.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/01/25/72575.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/72575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/72575.html</trackback:ping><description><![CDATA[对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的<br>.bashrc或.bash_profile里增加下面的内容：<br>(注意：等号前面不要加空格,否则可能出现 command not found)<br><br>#在PATH中找到可执行文件程序的路径。<br>export PATH =$PATH:$HOME/bin<br><br>#gcc找到头文件的路径<br>C_INCLUDE_PATH=/usr/include/libxml2:/MyLib<br>export C_INCLUDE_PATH<br><br>#g++找到头文件的路径<br>CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib<br>export CPLUS_INCLUDE_PATH<br><br>#找到动态链接库的路径<br>LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib <br>export LD_LIBRARY_PATH<br><br>#找到静态库的路径<br>LIBRARY_PATH=$LIBRARY_PATH:/MyLib<br>export LIBRARY_PATH<br> <img src ="http://www.cppblog.com/bujiwu/aggbug/72575.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-01-25 18:20 <a href="http://www.cppblog.com/bujiwu/archive/2009/01/25/72575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux线程学习笔记</title><link>http://www.cppblog.com/bujiwu/archive/2009/01/18/72256.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 18 Jan 2009 06:00:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/01/18/72256.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/72256.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/01/18/72256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/72256.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/72256.html</trackback:ping><description><![CDATA[<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;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;standard&nbsp;I/O&nbsp;routines&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #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;">pthread.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;pthread&nbsp;functions&nbsp;and&nbsp;data&nbsp;structures&nbsp;</span><span style="color: #008000;">*/</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;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;head&nbsp;file&nbsp;for&nbsp;sleep&nbsp;function&nbsp;</span><span style="color: #008000;">*/</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: #008000;">/*</span><span style="color: #008000;">&nbsp;global&nbsp;mutex&nbsp;for&nbsp;our&nbsp;program.&nbsp;assignment&nbsp;initializes&nbsp;it&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">pthread_mutex_t&nbsp;a_mutex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PTHREAD_MUTEX_INITIALIZER;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;function&nbsp;to&nbsp;be&nbsp;executed&nbsp;by&nbsp;the&nbsp;new&nbsp;thread&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;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;do_loop(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;data)<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: #0000ff;">int</span><span style="color: #000000;">&nbsp;me&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: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">)data);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;thread&nbsp;identifying&nbsp;number&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;">int</span><span style="color: #000000;">&nbsp;rc;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;contain&nbsp;mutex&nbsp;lock/unlock&nbsp;results&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><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;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;lock&nbsp;the&nbsp;mutex,&nbsp;to&nbsp;assure&nbsp;exclusive&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_mutex_lock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a_mutex);<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;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</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;">4</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">'%d'&nbsp;-&nbsp;Got&nbsp;'%d'\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;me,&nbsp;i);<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;unlock&nbsp;mutex&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_mutex_unlock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a_mutex);<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;terminate&nbsp;the&nbsp;thread&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_exit(NULL);<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;like&nbsp;any&nbsp;CPlusPlus&nbsp;program,&nbsp;program's&nbsp;execution&nbsp;begins&nbsp;in&nbsp;main&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;">g++&nbsp;-o&nbsp;Thread&nbsp;Thread.cpp&nbsp;-lpthread</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;"></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></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thr_id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;thread&nbsp;ID&nbsp;for&nbsp;the&nbsp;newly&nbsp;created&nbsp;thread&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;&nbsp;p_thread1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;thread's&nbsp;structure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;&nbsp;p_thread2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;thread's&nbsp;structure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;thread&nbsp;1&nbsp;identifying&nbsp;number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;thread&nbsp;2&nbsp;identifying&nbsp;number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;create&nbsp;a&nbsp;new&nbsp;thread&nbsp;that&nbsp;will&nbsp;execute&nbsp;'do_loop()'&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;thr_id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p_thread1,&nbsp;NULL,&nbsp;do_loop,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a);<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;create&nbsp;a&nbsp;new&nbsp;thread&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;thr_id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p_thread2,&nbsp;NULL,&nbsp;do_loop,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">b);<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;</span><span style="color: #008000;">/*</span><span style="color: #008000;">wait&nbsp;until&nbsp;sub&nbsp;thread&nbsp;exit</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(p_thread1,&nbsp;NULL);<br></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(p_thread2,&nbsp;NULL);<br></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">50</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;">51</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;"></span></div>
<br>编译：&nbsp;gcc -o pthread pthread.c&nbsp; -lpthread<br><br>
<br><a href="http://www.cppblog.com/Files/bujiwu/Thread.rar" title="Linux下线程与信号量例子">Linux下线程与信号量例子</a><br> <img src ="http://www.cppblog.com/bujiwu/aggbug/72256.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-01-18 14:00 <a href="http://www.cppblog.com/bujiwu/archive/2009/01/18/72256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gvim操作汇总</title><link>http://www.cppblog.com/bujiwu/archive/2009/01/04/71166.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 04 Jan 2009 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/01/04/71166.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/71166.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/01/04/71166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/71166.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/71166.html</trackback:ping><description><![CDATA[1、Vim中替换操作<br>&nbsp;&nbsp; s/old/new/g&nbsp;&nbsp; #替换当前行old为new<br>&nbsp;&nbsp; 6,7s/old/new/g&nbsp; #替换第六行到第七行中的old为new<br>&nbsp;&nbsp; %s/old/new/g&nbsp;&nbsp;&nbsp; #替换全部的old为new<br><br>2、查找字符串<br>&nbsp;&nbsp; :/Count&nbsp;&nbsp;&nbsp; #正向查找Count&nbsp; 按n显示下一次<br>&nbsp;&nbsp; :%Count&nbsp;&nbsp;&nbsp; #逆向查找Count <br>&nbsp;&nbsp; 在当前字符串上按*,正向查找当前字符串<br>&nbsp;&nbsp; 在当前字符串上按#,反向查找当前字符串<br>
<br>3、字符串联想<br>&nbsp;&nbsp; Ctrl+p<br><br>4、重复上一行内容<br>&nbsp;&nbsp; Ctrl+y<br><br>5、跳转<br>&nbsp;&nbsp; gg&nbsp; 跳到文件首行<br>&nbsp;&nbsp; G&nbsp;&nbsp; 跳到文件尾行<br>&nbsp;&nbsp; 123G 跳到第123行<br>&nbsp;&nbsp; 数字0 移到当前行末尾<br>&nbsp;&nbsp; $&nbsp;&nbsp;&nbsp;&nbsp; 移到当前行首部<br>&nbsp;&nbsp; 光标在{、}、[、]等括号上按%跳到相应的括号上<br>6、新增一行<br>&nbsp;&nbsp; o&nbsp;&nbsp; 在当前光标下一行新增一行<br>&nbsp;&nbsp; O&nbsp;&nbsp; 在当前光标上一行新增一行<br><br>7、显示/隐藏行号<br>&nbsp;&nbsp; set nu 显示行号<br>&nbsp;&nbsp; set nonu 隐藏等号<br><br>8、在Gvim中执行外部shell命令<br>&nbsp;&nbsp; :!外部命令，如:<br>&nbsp;&nbsp; :!ls -l<br><br>9、删除/复制行<br>&nbsp;&nbsp; dd 删除一行<br>&nbsp;&nbsp; 3dd 删除当前光标所在行的以下三行<br>&nbsp;&nbsp; yy&nbsp; 复制一行<br>&nbsp;&nbsp; 3yy 复制三行<br>&nbsp;&nbsp; p 粘贴<br><br>10、撤消与撤消的撤消<br>&nbsp;&nbsp; u 撤消<br>&nbsp;&nbsp; Ctrl+R 撤消的撤消<br><br><br>.vimrc模板<br><a  href="http://www.cppblog.com/Files/bujiwu/vimrc.rar">http://www.cppblog.com/Files/bujiwu/vimrc.rar</a><br><br>"============================================<br>syntax on<br>set nu<br><br>set autoindent<br>set cindent<br>set smartindent<br><br>set softtabstop=4<br>set tabstop=4<br>set shiftwidth=4<br>set expandtab<br>set smarttab<br><br>set nobackup<br><br>set cursorline<br><br>set tags="./tags,./../tags,./../../tags"<br>"=================================================<br><br>
<br> <img src ="http://www.cppblog.com/bujiwu/aggbug/71166.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-01-04 21:39 <a href="http://www.cppblog.com/bujiwu/archive/2009/01/04/71166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下文件打包与解包</title><link>http://www.cppblog.com/bujiwu/archive/2009/01/04/71152.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 04 Jan 2009 11:23:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/01/04/71152.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/71152.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/01/04/71152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/71152.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/71152.html</trackback:ping><description><![CDATA[打包(.tar):<br>&nbsp; tar -cvf Pro.tar /home/lin/Pro&nbsp;&nbsp; #将/home/lin/Pro文件夹下的所有文件打包成Pro.tar<br><br>打解包(.tar.gz)<br>&nbsp; tar -cvzf firefox-3.0.3.tar.gz firefox&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #将firefox文件夹打包为firefox-3.0.3.tar.gz<br>&nbsp; tar -xvzf firefox-3.0.3.tar.gz<br><br>打解包(.tar.bz2)<br>&nbsp; tar -cvjf firefox-3.0.3.tar.bz2&nbsp; firefox/&nbsp;&nbsp;&nbsp; #将firefox文件夹打包为firefox-3.0.3.tar.bz2<br>&nbsp; tar -xvjf firefox-3.0.3.tar.bz2<br><br>参数说明：<br>c&nbsp;&nbsp; 创建新的档案文件。如果用户想备份一个目录或是一些文件，就要选择这个选项。<br>x&nbsp;&nbsp; 从档案文件中释放文件。<br>v&nbsp;&nbsp; 详细报告tar处理的文件信息。如无此选项，tar不报告文件信息。<br>z&nbsp;&nbsp; 用gzip来压缩/解压缩文件，加上该选项后可以将档案文件进行压缩，但还原时也一定要使用该选项进行解压缩。 <br>f&nbsp;&nbsp; 使用档案文件或设备，这个选项通常是必选的。<br><br><br><br>   <img src ="http://www.cppblog.com/bujiwu/aggbug/71152.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-01-04 19:23 <a href="http://www.cppblog.com/bujiwu/archive/2009/01/04/71152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux常用知识收集！</title><link>http://www.cppblog.com/bujiwu/archive/2009/01/04/71149.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Sun, 04 Jan 2009 11:06:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2009/01/04/71149.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/71149.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2009/01/04/71149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/71149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/71149.html</trackback:ping><description><![CDATA[1、程序前台与后台切换<br>&nbsp;&nbsp; ctrl+z&nbsp; 将进程切换到后台<br>&nbsp;&nbsp; fg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调到前台<br><br>2、linux批量查找文件内容<br>&nbsp;&nbsp; find ./ -name "*.cpp" | xargs grep '要查找的内容'<br>&nbsp;&nbsp; 如:find . -name "*.cpp" | xargs grep 'main'<br><br>&nbsp;&nbsp; 如果需要查找的内容包含特殊符号，比如$等等，grep要加参数<br>&nbsp;&nbsp; find ./ -name "*.cpp" | xargs grep -F '要查找的内容'<br><br>3、删除特定类型的文件<br>&nbsp;&nbsp; 如:后缀是.log的文件<br>&nbsp;&nbsp; find . -name "*.log"&nbsp; -exec rm {} \;<br>&nbsp;&nbsp; 或者: find . -name "*.log" | xargs rm<br><br><br>4、文件批量重命名<br>&nbsp;&nbsp; 将所有*.h后缀名的文件重命名为*.header<br>&nbsp;&nbsp; rename .h .header *.h<br>&nbsp;&nbsp; 格式： rename 替换前的内容 替换后的内容 通配符<br>&nbsp;&nbsp; <br>5、列出除什么之外的文件<br>&nbsp;&nbsp; 列出不包括swallow字符的文件： ls | grep -v swallow<br>&nbsp;&nbsp; 删除不包括swallow字符的文件： ls | grep -v swallow | xargs rm<br><br>6、将用户增加到sudo组<br>&nbsp;&nbsp; root# vim /etc/sudoers<br>&nbsp;&nbsp; 在这里增加内容：<br>&nbsp;&nbsp; ## Allow root to run any commands anywhere <br>&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp; ALL=(ALL)&nbsp;&nbsp; ALL<br>&nbsp;&nbsp; bujiwu&nbsp; ALL=(ALL)&nbsp;&nbsp; ALL<br>&nbsp;&nbsp; <br>7、修改/etc/crontab文件增加系统定时运行程序功能<br><br>8、make时检测到时钟错误。您的创建可能是不完整.<br>&nbsp;&nbsp; 由于文件时钟与系统时钟不匹配。所以可以用touch更改文件时间来Update.<br>&nbsp;&nbsp; find . -type f -exec touch {} \; <br><img src ="http://www.cppblog.com/bujiwu/aggbug/71149.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-01-04 19:06 <a href="http://www.cppblog.com/bujiwu/archive/2009/01/04/71149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Makefile文件</title><link>http://www.cppblog.com/bujiwu/archive/2008/12/29/70720.html</link><dc:creator>bujiwu</dc:creator><author>bujiwu</author><pubDate>Mon, 29 Dec 2008 14:40:00 GMT</pubDate><guid>http://www.cppblog.com/bujiwu/archive/2008/12/29/70720.html</guid><wfw:comment>http://www.cppblog.com/bujiwu/comments/70720.html</wfw:comment><comments>http://www.cppblog.com/bujiwu/archive/2008/12/29/70720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bujiwu/comments/commentRss/70720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bujiwu/services/trackbacks/70720.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;"><fieldset><legend style="color: #8978ff;">生成动态库(*.so)Makefile文件</legend>#Lib information<br>CURDIR =$(shell pwd)<br>LIBNAME :=libmyso.so<br>OUTDIR :=$(CURDIR)<br>OUTFILE :=$(OUTDIR)/$(LIBNAME)<br><br>SRC =node.cpp<br>OBJS =$(SRC:.cpp=.o)<br><br>#Complier information<br>CC = g++<br>INCPATH :=<br>LIBPATH :=<br>LIBS :=<br>COMOPT := -O2<br><br>all:$(OBJS)<br>&nbsp;&nbsp; &nbsp;$(CC) -fPIC -shared -o $(OUTFILE) $(OBJS)<br>&nbsp;&nbsp; &nbsp;<br>%.o:%.cpp<br>&nbsp;&nbsp;&nbsp; $(CC) -c $(COMOPT) $(INCPATH) -o $@ $&lt;<br><br>clean:<br>&nbsp;&nbsp;&nbsp; rm -rf $(CURDIR)/*.o <br><br></fieldset><br><fieldset><legend style="color: #8978ff;">生成静态库(*.a)Makefile文件</legend>#lib information<br>CURDIR =$(shell pwd)<br>LIBNAME :=libmylib.a<br>OUTDIR :=$(CURDIR)<br>OUTFILE :=$(OUTDIR)/$(LIBNAME)<br><br>SRC = Display.cpp<br>OBJS =$(SRC:.cpp=.o)<br><br>#complier information<br>CC=g++<br>INCPATH :=<br>LIBPATH :=<br>LIBS :=<br>COMOPT := -O2<br><br>all:$(OBJS)<br>&nbsp;&nbsp; &nbsp;ar -r $(OUTFILE) $(OBJS)<br>&nbsp;&nbsp; &nbsp;<br>%.o:%.cpp<br>&nbsp;&nbsp;&nbsp; $(CC) -c $(COMOPT) $(INCPATH) -o $@ $&lt;<br><br>clean:<br>&nbsp;&nbsp;&nbsp; rm -rf $(CURDIR)/*.o <br><br></fieldset><br><fieldset><legend style="color: #8978ff;">比较通用的Makefile文件</legend>#CPP Files Directory<br>vpath %.cpp ./../&nbsp; &nbsp;<br>vpath %.cpp ./../Student<br><br>#Head Files Directory&nbsp;&nbsp; &nbsp;<br>vpath %.h ./../Student/<br><br>#Get Makefile Current Directory<br>CURDIR =$(shell pwd)<br><br>SRC =Main.cpp \<br>&nbsp;&nbsp;&nbsp;&nbsp; Student.cpp<br>&nbsp;&nbsp;&nbsp; &nbsp;<br>SRC_OBJ =$(SRC:.cpp=.o)<br>CCFLAGS =-O2 -g -DUT_4_16<br>CXX =g++<br>CPPFLAGS =<br><br>#Load Static Library<br>LIBDIR =-L $(CURDIR)/../StaticLib&nbsp; -lmylib $(CURDIR)/../DynamicLib/libmyso.so <br>#Load Library Head Files<br>INCDIR =-I $(CURDIR)/../StaticLib&nbsp; -I $(CURDIR)/../DynamicLib<br><br>.PHONY :all<br>all :edit run<br><br>.PHONY :edit<br>edit: $(SRC_OBJ)<br>$(SRC_OBJ):%.o :%.cpp <br>&nbsp;&nbsp;&nbsp; $(CXX) $(INCDIR) -c $(CCFLAGS) $(CPPFLAGS) $&lt; -o $@<br>&nbsp;&nbsp;&nbsp; <br>.PHONY :run<br>run: $(SRC_OBJ)<br>&nbsp;&nbsp;&nbsp; $(CXX) $(INCDIR) $(SRC_OBJ) $(LIBDIR) -o Main<br>&nbsp;&nbsp;&nbsp; <br>.PHONY :clean<br>clean:<br>&nbsp;&nbsp;&nbsp; rm $(SRC_OBJ)<br></fieldset></span><span style="color: #000000;"><br><fieldset><legend style="color: #688eff;">最简单的Makefile文件</legend>#假设只有一个文件Main.cpp生成Makefile文件<br>Main:Main.o<br>&nbsp;&nbsp; &nbsp;g++ -o $@ $^<br>%.o:%.cpp %.h<br>&nbsp;&nbsp; &nbsp;g++ -c $@ $&gt;
<br></fieldset><br>不需要手工添加各个文件的依赖关系，使用vpath自动搜索文件！<br>
测试工程：<br>
<a href="http://www.cppblog.com/Files/bujiwu/Linux.rar">http://www.cppblog.com/Files/bujiwu/Linux.rar</a>
<br></span></div>
<br><br>   <img src ="http://www.cppblog.com/bujiwu/aggbug/70720.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> 2008-12-29 22:40 <a href="http://www.cppblog.com/bujiwu/archive/2008/12/29/70720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>