<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[前企业邮箱杀rpc的shell，都快忘记了，做个备份]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 23 Sep 2008 10:31:02 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	问题提出：为何多线程？&nbsp;&nbsp;答：为了问题得到有效解决.<br/>什么问题：由于rpc僵死，ps aux&#124;gep rpc&nbsp;&nbsp;rpc进程还在，但是它已经死掉失效了，但系统也无法知道，我们只好去调用rpc里面的一个函数看返回结果。<br/>问：为何不用一个进程去判断而要用多线程？<br/>答：一个进程掉用rpc里面的一个函数，在rpc死后如果调用，调用者无法退出终端，也死在那儿了.<br/>问：为何不用多进程？<br/>答：多进程不太熟悉，尝试失败。<br/>最后：选择了多线程。。。<br/>多线程的大致流程：<br/>一个线程睡觉，一个干事情，干不动事情，睡觉的线程杀了干事情的线程。。。^_^（有趣）<br/><br/><div class="code">#!/bin/sh<br/><br/>state=`/usr/local/bin/test_rpc_server_62 afeng@afeng.sina.net`;<br/><br/>if &#91; &quot;$state&quot; != &quot;OK&quot; &#93;; then<br/>ps auxwww &#124;grep rpc &#124;awk &#039;&#123; print &quot;kill -9 &quot; $2 &#125;&#039; &#124;sh<br/>if &#91; -e /usr/local/etc/rc.d/entplatform_rpcserver.sh &#93;; then<br/>sh /usr/local/etc/rc.d/entplatform_rpcserver.sh<br/>else<br/>ps auxwww &#124;grep rpc &#124;awk &#039;&#123; print &quot;kill -9 &quot; $2 &#125;&#039; &#124;sh<br/>cat /etc/rc.local &#124;grep rpc &#124;sh<br/>fi<br/>echo &quot;rpc bad, restart.&quot;;<br/>else<br/>echo &quot;rpc ok.&quot;;<br/>fi</div><br/><br/>shell如，一行搞定：<br/><div class="code">grep &#039;&#124;&#039;`date +20%y-%m-%d`&#039; ALL&nbsp;&nbsp;FUNISHED! &#124;&#039; /data0/daemon_log/popularity/addScoreOnline.log&nbsp;&nbsp;&gt;&gt;&nbsp;&nbsp;/data0/daemon_log/popularity/addScoreOnlineSh.log</div><br/><br/><br/>shell字符串相连：<br/><br/><br/><div class="code">A=EDIT<br/>N=1<br/>B=$A$N<br/>echo $B</div><br/><br/><br/>c程序：<br/><br/><br/><div class="code">/* multiple thread programming in freebsd<br/>&nbsp;&nbsp;*author : xiangdong2,zhirui<br/>&nbsp;&nbsp;*E-mail : xiangdong2@staff.sina.com.cn zhirui@staff.sina.com.cn <br/>*/<br/>#include &lt;pthread.h&gt;<br/>#include &lt;stdio.h&gt;<br/>#include &lt;sys/time.h&gt;<br/>#include &lt;string.h&gt;<br/><br/>//////////////xiangdong/////////////////////////<br/>#include &quot;clientlib.h&quot;<br/>#include &quot;clnt_ent_rpcserver.h&quot;<br/>////////////////////////////////////////////////<br/><br/>pthread_t thread&#91;2&#93;;<br/>pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;<br/>pthread_t th;<br/><br/>char emailAddr&#91;128&#93; = &#123;0&#125;;<br/>int ret = 0;<br/><br/>void* rpcCheck(void *arg);<br/><br/>void *thread1()<br/>&#123;<br/>&nbsp;&nbsp;sleep(1);<br/>&nbsp;&nbsp;if(ret &lt;= 0)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The Rpc be down..........&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;pthread_cancel(th);<br/>&nbsp;&nbsp;&nbsp;&nbsp;pthread_exit(NULL);<br/>&nbsp;&nbsp;&#125;else&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;switch(ret)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;case QERR_OK:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;OK&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;case QERR_SERVER:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_SERVER&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;case QERR_MEMORY:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_MEMORY&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;case QERR_HASH:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_HASH&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;case QERR_MYSQL:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_MYSQL&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;case CANTCONNECTSERVER:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;CANTCONNECTSERVER&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;default:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Other error&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pthread_exit(NULL);<br/>&#125;<br/><br/>void thread_create(void)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int temp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;thread, 0, sizeof(thread));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//comment1<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*创建线程*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp = pthread_create(&amp;thread&#91;0&#93;, NULL, thread1, NULL)) != 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //comment2<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;线程1创建失败!&#92;n&quot;);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;线程1被创建&#92;n&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp = pthread_create(&amp;thread&#91;1&#93;, NULL, rpcCheck, NULL)) != 0)&nbsp;&nbsp;//comment3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;线程2创建失败!&#92;n&quot;);<br/>&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;线程2被创建&#92;n&quot;);<br/>&nbsp;&nbsp;*/<br/><br/>&#125;<br/><br/>void thread_wait(void)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;if(thread&#91;0&#93; !=0) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(thread&#91;0&#93;,NULL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/><br/>void* rpcCheck(void* arg)<br/>&#123;<br/><br/>&nbsp;&nbsp;th=pthread_self();<br/>&nbsp;&nbsp;ENTERPRISE ent;<br/>&nbsp;&nbsp;ENTDOMAIN dm;<br/>&nbsp;&nbsp;EMAIL em;<br/>&nbsp;&nbsp;ENTINFO ei;<br/>&nbsp;&nbsp;char email&#91;128&#93; = &#123;0&#125;;<br/>&nbsp;&nbsp;snprintf(email, sizeof(email) - 1, &quot;%s&quot;, emailAddr);<br/>&nbsp;&nbsp;em.projectid = ent.projectid = dm.projectid = 1;<br/>&nbsp;&nbsp;em.method = BY_EID + 1;<br/>&nbsp;&nbsp;strcpy(em.email, email);<br/>&nbsp;&nbsp;pthread_detach(pthread_self());<br/>&nbsp;&nbsp;pthread_mutex_lock(&amp;mut);<br/>&nbsp;&nbsp;ret = ent_rpc_getemail(&amp;em);<br/>&nbsp;&nbsp;pthread_mutex_unlock(&amp;mut);<br/>&#125;<br/><br/><br/><br/>int main(int argc, char* argv&#91;&#93;)<br/>&#123;<br/>&nbsp;&nbsp;//帮助提示<br/>&nbsp;&nbsp;if(argc != 2)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;用法:%s &lt;邮件地址&gt;&#92;n&quot;, argv&#91;0&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;返回值说明：&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;OK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －－－ 有效的邮件地址&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_SERVER&nbsp;&nbsp; －－－ RPC服务器内部错误&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_MEMORY&nbsp;&nbsp; －－－ RPC内存错&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_HASH&nbsp;&nbsp; －－－ RPC内部HASH错&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;QERR_MYSQL&nbsp;&nbsp; －－－ 无效的邮件地址&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;CANTCONNECTSERVER 连接RPC服务器失败&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0; <br/>&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;snprintf(emailAddr, sizeof(emailAddr) - 1, &quot;%s&quot;, argv&#91;1&#93;);<br/><br/>&nbsp;&nbsp;/*用默认属性初始化互斥锁*/<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;pthread_mutex_init(&amp;mut,NULL);<br/>&nbsp;&nbsp;//printf(&quot;我是主函数哦，我正在创建线程，呵呵&#92;n&quot;);<br/>&nbsp;&nbsp;thread_create();<br/>&nbsp;&nbsp;//printf(&quot;我是主函数哦，我正在等待线程完成任务阿，呵呵&#92;n&quot;);<br/>&nbsp;&nbsp;thread_wait();<br/>&nbsp;&nbsp;return 0;<br/>&#125;</div><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 前企业邮箱杀rpc的shell，都快忘记了，做个备份]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>