﻿<?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++博客-编写生产美金的代码...</title><link>http://www.cppblog.com/go-benny/</link><description>追求的境界</description><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 06:55:45 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 06:55:45 GMT</pubDate><ttl>60</ttl><item><title>IOWait相关问题</title><link>http://www.cppblog.com/go-benny/archive/2008/04/23/47908.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Wed, 23 Apr 2008 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2008/04/23/47908.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/47908.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2008/04/23/47908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/47908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/47908.html</trackback:ping><description><![CDATA[定位IOWait高的一些方法和工具：<br><br>在Linux性能分析时经常使用的工具包括：top, iostat, vmstat等<br><br><br>IOWait高的一些处理方法<br><br>1、检查RAID的状态，比如是否正在重建或者没有初始化<br>2、替换操作系统的内核，最好使用发行版标准的Linux kernel，因为有比较多的补丁<br>3、检查/proc/sys/vm下面是否可以优化<br>4、是否使用了文件系统，文件系统是否有优化的选项，比如在RAID5上采用xfs文件系统时，<br>&nbsp;&nbsp; 可以调节一些参数优化性能<br>5、客户端程序是否产生了过大的压力，比如磁盘的读写性能只有10MB/s，每个线程的读写<br>&nbsp;&nbsp; 速度为5MB/s，那么如果读写线程数为20的话，无疑会造成IOWait过高<br>
<pre>6、查看进程状态<br>	ps -eo pid,user,wchan=WIDE-WCHAN-COLUMN -o s,cmd|awk ' $4 ~ /D/ {print $0}'<br>	lsof -p $pid<br></pre>
7、使用block_dump<br>
<pre>	/etc/init.d/syslog stop<br>	echo 1 &gt; /proc/sys/vm/block_dump<br>	sleep 60<br>	dmesg | awk '/(READ|WRITE|dirtied)/ {process[$1]++} END {for (x in process) \<br>		print process[x],x}' |sort -nr |awk '{print $2 " " $1}' | \<br>	head -n 10<br><br>	echo 0 &gt; /proc/sys/vm/block_dump<br>	/etc/init.d/syslog start<br><br><br></pre>
<br><br><img src ="http://www.cppblog.com/go-benny/aggbug/47908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2008-04-23 14:06 <a href="http://www.cppblog.com/go-benny/archive/2008/04/23/47908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C程序调用外部命令2个例子</title><link>http://www.cppblog.com/go-benny/archive/2008/04/22/47835.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Tue, 22 Apr 2008 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2008/04/22/47835.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/47835.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2008/04/22/47835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/47835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/47835.html</trackback:ping><description><![CDATA[<br>例子1 - 调用外部命令，然后检查外部命令的返回值<br><br>#include &lt;stdlib.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;sys/wait.h&gt;<br><br>int main(int argc, char **argv)<br>{<br>&nbsp;&nbsp;&nbsp; int error = system("ps -ef");<br>&nbsp;&nbsp;&nbsp; printf("Outer program return value: %d\n", WEXITSTATUS(error));<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>调用外部程序例子2<br><br>例子2 － 调用外部命令，并获得外部命令屏幕输出内容<br><br>#include &lt;stdlib.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br><br>char buffer[4096];<br><br>int main(int argc, char** argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE *fp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *cmd = "ps";<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp = popen(cmd, "r");<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fp == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(buffer, 0, sizeof(buffer));<br><br>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;  /*逐行再打印出来*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (fgets(buffer, sizeof(buffer), fp) != NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pclose(fp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br><br><br> <img src ="http://www.cppblog.com/go-benny/aggbug/47835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2008-04-22 17:57 <a href="http://www.cppblog.com/go-benny/archive/2008/04/22/47835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过sysfs把事件通知用户空间程序</title><link>http://www.cppblog.com/go-benny/archive/2007/10/30/35507.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Tue, 30 Oct 2007 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/10/30/35507.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/35507.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/10/30/35507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/35507.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/35507.html</trackback:ping><description><![CDATA[sysfs中有事件通知机制，我找了下，发现有下面的代码可用<br><br>
<pre>#include &lt;sys/select.h&gt;<br>#include &lt;sys/inotify.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;signal.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;stdio.h&gt;<br><br>/**<br> * Compilation : gcc inotify.c -o inotify -O2 -Wall -W -Werror -ansi -pedantic<br> **/<br><br>int fd, wd;<br><br>void sigint_handler(int signum)<br>{<br>    (void) signum;<br><br>    /* Nous ne surveillons plus ce fichier/r&#195;&#169;pertoire */<br>    if (inotify_rm_watch(fd, wd)) {<br>        perror("inotify_rm_watch");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    /* Fermeture du descripteur de fichier obtenu lors de l'initialisation d'inotify */<br>    if (close(fd) &lt; 0) {<br>        perror("close");<br>        exit(EXIT_FAILURE);<br>    }<br><br>    exit(EXIT_SUCCESS);<br>}<br><br>void afficher_masque(int mask)<br>{<br>    printf("Event : ");<br>    if (mask &amp; IN_ACCESS)<br>        printf("IN_ACCESS");<br>    if (mask &amp; IN_MODIFY)<br>        printf("IN_MODIFY");<br>    if (mask &amp; IN_ATTRIB)<br>        printf("IN_ATTRIB");<br>    if (mask &amp; IN_CLOSE)<br>        printf("IN_CLOSE");<br>    if (mask &amp; IN_OPEN)<br>        printf("IN_OPEN");<br>    if (mask &amp; IN_MOVED_FROM)<br>        printf("IN_MOVED_FROM");<br>    if (mask &amp; IN_MOVED_TO)<br>        printf("IN_MOVED_TO");<br>    if (mask &amp; IN_MOVE_SELF)<br>        printf("IN_MOVE_SELF");<br>    if (mask &amp; IN_DELETE)<br>        printf("IN_DELETE");<br>    if (mask &amp; IN_CREATE)<br>        printf("IN_CREATE");<br>    if (mask &amp; IN_DELETE_SELF)<br>        printf("IN_DELETE_SELF");<br>    if (mask &amp; IN_UNMOUNT)<br>        printf("IN_UNMOUNT");<br>    if (mask &amp; IN_Q_OVERFLOW)<br>        printf("IN_Q_OVERFLOW");<br>    if (mask &amp; IN_IGNORED)<br>        printf("IN_IGNORED");<br>    if (mask &amp; IN_ISDIR)<br>        printf("IN_ISDIR");<br>    else<br>        printf("(file)");<br>}<br><br>int main(int argc, char *argv[])<br>{<br>    size_t r;<br>    fd_set fds;<br>    char buffer[8192];<br>    struct inotify_event *event;<br><br>    if (argc != 2) {<br>        fprintf(stderr, "usage : %s file or directory to monitor\n", argv[0]);<br>        return EXIT_FAILURE;<br>    }<br><br>    /* Initialisation d'inotify */<br>    fd = inotify_init();<br>    if (fd &lt; 0) {<br>        perror("inotify_init");<br>        return EXIT_FAILURE;<br>    }<br><br>    /* Surveillance du fichier/r&#195;&#169;pertoire pass&#195;&#169; en param&#195;&#168;tre<br>     * On accepte tous les &#195;&#169;v&#195;&#168;nements possibles */<br>    wd = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS);<br>    if (wd &lt; 0) {<br>        perror("inotify_add_watch");<br>        return EXIT_FAILURE;<br>    }<br><br>    printf("Monitoring : '%s' (number = %d)\n", argv[1], wd);<br><br>    /* Capture de SIGINT (Ctrl + C) */<br>    signal(SIGINT, sigint_handler);<br><br>    while (1) {<br>        FD_ZERO(&amp;fds);<br>        FD_SET(fd, &amp;fds);<br>        if (select(fd + 1, &amp;fds, NULL, NULL, 0) &lt;= 0) {<br>            continue;<br>        }<br><br>        /* Obtention des informations sur l'&#195;&#169;v&#195;&#168;nement qui vient de se produire */<br>        r = read(fd, buffer, sizeof(buffer));<br>        if (r &lt;= 0) {<br>            perror("read");<br>            return EXIT_FAILURE;<br>        }<br><br>        event = (struct inotify_event *) buffer;<br>        printf("Monitored file n&#194;&#176;%d\t", event-&gt;wd);<br>        afficher_masque(event-&gt;mask);<br><br>        if (event-&gt;len) {<br>            printf("\tObject : %s", event-&gt;name);<br>        }<br>        printf("\n");<br>        <br>        /* Gedit act strangly, reload the file if we get an IN_DELETE_SELF event.<br>        if (event-&gt;mask &amp; IN_DELETE_SELF) {<br>        	printf("Reloding watch");<br>        	inotify_rm_watch(fd, wd);<br>        	wd = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS);<br>    		if (wd &lt; 0) {<br>       			perror("inotify_add_watch");<br>        		return EXIT_FAILURE;<br>    		}*/<br>    }<br><br>    return EXIT_FAILURE;<br>}</pre>
<br>文档看：linux/Documentation/filesystem/inotify.txt<br><br> <img src ="http://www.cppblog.com/go-benny/aggbug/35507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-10-30 11:51 <a href="http://www.cppblog.com/go-benny/archive/2007/10/30/35507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软RAID的简单用法</title><link>http://www.cppblog.com/go-benny/archive/2007/10/25/35141.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Thu, 25 Oct 2007 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/10/25/35141.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/35141.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/10/25/35141.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/35141.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/35141.html</trackback:ping><description><![CDATA[mdadm使用了md驱动，lvm使用了dm驱动。通常我们都是使用mdadm创建各种级别的RAID，然后再通过lvm创建pv,vg和lv，lv是最后用户可以看到的&#8220;逻辑盘&#8221;。实际上,mdadm和lvm完全可以被替代，目前有evms已经这样做了。下面是mdadm的一些命令：<br><br>1、创建md<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mdadm -C /dev/md0 -l5 -n3 /dev/sd{a,b,c} --assume-clean<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面命令创建一个由3个scsi盘组成的raid5阵列，注意，如果没有使用--assume-clean参数的话，创建完<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md后，系统会自动帮你重建阵列<br><br><br>2、删除阵列<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mdadm -S /dev/md0 '停止阵列<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mdadm --zero-superblock /dev/sd{a,b,c} '清除超级块信息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查了md的代码，觉得挺可惜的是，没有把一个创建出来的md块设备删除的代码，出了在md_exit（即模块退出时才删除md块设备)<br><br><br>3、监控阵列<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是使用c程序监控<br>&nbsp;<br>//app.c<br>#include &lt;stdio.h&gt;<br>int main(int argc, const char* argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0; i&lt;argc; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("argv[i]=%s\n", argv[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>}
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gcc -o app app.c<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mdadm --monitor -p app --scan &amp;<br><br>4、删除／添加阵列磁盘<br>&nbsp;&nbsp;&nbsp;&nbsp; mdadm /dev/md0 -a /dev/sda -f /dev/sdb -r /dev/sdb<br><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br><img src ="http://www.cppblog.com/go-benny/aggbug/35141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-10-25 17:30 <a href="http://www.cppblog.com/go-benny/archive/2007/10/25/35141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式编程见解</title><link>http://www.cppblog.com/go-benny/archive/2007/09/29/33207.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Sat, 29 Sep 2007 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/09/29/33207.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/33207.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/09/29/33207.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/33207.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/33207.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/go-benny/archive/2007/09/29/33207.html'>阅读全文</a><img src ="http://www.cppblog.com/go-benny/aggbug/33207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-09-29 17:24 <a href="http://www.cppblog.com/go-benny/archive/2007/09/29/33207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>emacs使用简单说明</title><link>http://www.cppblog.com/go-benny/archive/2007/09/25/32850.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Tue, 25 Sep 2007 08:49:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/09/25/32850.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/32850.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/09/25/32850.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/32850.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/32850.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/go-benny/archive/2007/09/25/32850.html'>阅读全文</a><img src ="http://www.cppblog.com/go-benny/aggbug/32850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-09-25 16:49 <a href="http://www.cppblog.com/go-benny/archive/2007/09/25/32850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spinlock误用</title><link>http://www.cppblog.com/go-benny/archive/2007/06/16/26411.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Fri, 15 Jun 2007 16:08:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/06/16/26411.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/26411.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/06/16/26411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/26411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/26411.html</trackback:ping><description><![CDATA[最近发现一处spinlock误用的案例，大概情况是这样的：<br><br>&nbsp;&nbsp;&nbsp; 有一个链表，中断程序和内核线程都需要去访问，代码中采用了spinlock<br>对链表进行保护，使用的下面的函数，<br>&nbsp;&nbsp;&nbsp; spin_lock()<br>&nbsp;&nbsp;&nbsp; spin_unlock()<br><br>&nbsp;&nbsp;&nbsp; 导致现象是，在繁忙操作这个表的时候，随机出现kernel bug的提示，然后系统死掉，定位为spinlock使用有误，原因是上述的函数只是禁止了抢占，但是没有关中断，所以正确的应该是使用下面的函数代替，<br>&nbsp;&nbsp;&nbsp; spin_lock_irqsave()<br>&nbsp;&nbsp;&nbsp; spin_unlock_irqrestore()<br>&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; <br><br><img src ="http://www.cppblog.com/go-benny/aggbug/26411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-06-16 00:08 <a href="http://www.cppblog.com/go-benny/archive/2007/06/16/26411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux kernel下实现Socket通讯</title><link>http://www.cppblog.com/go-benny/archive/2007/03/09/19468.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Thu, 08 Mar 2007 17:01:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/03/09/19468.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/19468.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/03/09/19468.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/19468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/19468.html</trackback:ping><description><![CDATA[1、struct socket表示一个BSD Socket，BSD Socket是一个编程模型，可以看成是一套比较固定的函数接口；<br />2、struct sock是传输层的struct socket。一个sock在逻辑上应该包含：<br />      (1)N个链表，用于存储发送数据和接受到的数据；<br />      (2)代表传输层、网络层和链路层的函数指针集。这里的一个函数指针集对应的应该就是一个编程模型，比如UDP模型或TCP模型。<br />3、TCP的特点：面向连接，基于流<br /><font face="verdana, arial, helvetica" size="2"><span style="font-size: 12px;" class="javascript" id="text1754942">         TCP
这种方式中，底层应该维护了一个复杂的state
machine和N个链表以保证数据的不丢失。由于TCP基于流，所以就存在自动组报问题。比如你的发送缓冲设为2 bytes，你发送了2条1
byte的消息，接受端只收到1条2bytes的消息，于是接受端需要自己解析消息。</span></font><font face="verdana, arial, helvetica" size="2"><span style="font-size: 12px;" class="javascript" id="text1754942"><br /><br />4、 UDP的特点：没有连接，基于消息。<br />       坏处是消息可能丢失，但是接收端不需要自己解析消息。<br />5、SCTP的特点：面向连接，基于消息<br /><br /><br /><br /><br /></span></font><img src ="http://www.cppblog.com/go-benny/aggbug/19468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-03-09 01:01 <a href="http://www.cppblog.com/go-benny/archive/2007/03/09/19468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多个工程时Makefile的组织方式</title><link>http://www.cppblog.com/go-benny/archive/2007/01/28/18110.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Sun, 28 Jan 2007 06:09:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/01/28/18110.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/18110.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/01/28/18110.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/18110.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/18110.html</trackback:ping><description><![CDATA[
		<div align="left">有多个子模块，他们都各自提供了自己的Makefile文件。<br />我推荐的一种组织方式是：<br /><br />比如有工程A,B,C<br /><br />我的Makefile组织方式是<br />~~~~~~~~~~~~~~<br />./Makefile      (总Makefile)<br />./A/Makefile  (子Makefile)<br />./B/Makefile  (子Makefile)<br />./C/Makefile  (子Makefile)<br /><br />总Makefile的实现<br />~~~~~~~~~<br /># include sub makefile<br />include A/Makefile<br />include B/Makefile<br />include C/Makefile<br /><br /># define grobal vars<br />DBG_TARGETS =debug_a \<br />                        debug_b \<br />                        debug_c<br />REL_TARGETS  =release_a \<br />                        release_b \<br />                        release_c <br />CLN_TARGETS =clean_a \<br />                        clean_b \<br />                        clean_c<br /><br /># define targets<br />debug : $(DBG_TARGETS)<br />release : $(REL_TARGETS)<br />clean : $(CLN_TARGETS)<br /><br /><br />子Makefile的实现<br />~~~~~~~~~<br /># define targets of a<br />debug  : <br />    echo "build debug version of a"<br />release :<br />    echo "build release version a"<br />clean  :<br />    echo "clean a"<br /><br />这种组织方式的好处<br />~~~~~~~~~~~~<br />1）简单，每个子模块只维护自己的Makefile文件，只需要提供<br />   预定义好的target即可<br />2）target可重用，比如我可以通过make release_a获得a模块<br />   的release版本<br /></div>
<img src ="http://www.cppblog.com/go-benny/aggbug/18110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-01-28 14:09 <a href="http://www.cppblog.com/go-benny/archive/2007/01/28/18110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Linux内核下调试代码的一些见解</title><link>http://www.cppblog.com/go-benny/archive/2007/01/27/18038.html</link><dc:creator>hzb</dc:creator><author>hzb</author><pubDate>Fri, 26 Jan 2007 17:56:00 GMT</pubDate><guid>http://www.cppblog.com/go-benny/archive/2007/01/27/18038.html</guid><wfw:comment>http://www.cppblog.com/go-benny/comments/18038.html</wfw:comment><comments>http://www.cppblog.com/go-benny/archive/2007/01/27/18038.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/go-benny/comments/commentRss/18038.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/go-benny/services/trackbacks/18038.html</trackback:ping><description><![CDATA[
		<div align="left">最近在linux内核态下编写、调试代码，一点心得是：<br /><br />1、kgdb比较难使用（环境比较难搭建，常死机），但是偶尔用一下还是挺不错的<br />   大致情况是：使用kgdb调时需要有2台主机，需要编译一份打了kgdb补丁的内核（具体看相关资料）<br /><br />2、使用printk还是比较方便的，<br />   日志一般是被打印到/var/log/messages中（当然这个是可以配置的）<br />   比较喜欢的命令是<br />   tail -f /var/log/messages |grep xxx<br />   demsg -c<br />   vi /var/log/messages<br /><br />3、用户态下通过字符设备调用ioctl获取调试信息。这种情况下一般是程序设计阶段就已经有考虑到<br /><br />4、通过/proc或/sysfs导出和设置属性的方式。使用这种方式可以直接通过shell脚本跟内核交互。<br />   可以参考:<br />   1) Documentation/kobject.txt<br />   2) http://www.linux.it/~rubini/docs/sysfs/sysfs.html<br /><br /></div>
<img src ="http://www.cppblog.com/go-benny/aggbug/18038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/go-benny/" target="_blank">hzb</a> 2007-01-27 01:56 <a href="http://www.cppblog.com/go-benny/archive/2007/01/27/18038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>