问题提出:为何多线程? 答:为了问题得到有效解决.
什么问题:由于rpc僵死,ps aux|gep rpc rpc进程还在,但是它已经死掉失效了,但系统也无法知道,我们只好去调用rpc里面的一个函数看返回结果。
问:为何不用一个进程去判断而要用多线程?
答:一个进程掉用rpc里面的一个函数,在rpc死后如果调用,调用者无法退出终端,也死在那儿了.
问:为何不用多进程?
答:多进程不太熟悉,尝试失败。
最后:选择了多线程。。。
多线程的大致流程:
一个线程睡觉,一个干事情,干不动事情,睡觉的线程杀了干事情的线程。。。^_^(有趣)
shell如,一行搞定:
shell字符串相连:
c程序:
什么问题:由于rpc僵死,ps aux|gep rpc rpc进程还在,但是它已经死掉失效了,但系统也无法知道,我们只好去调用rpc里面的一个函数看返回结果。
问:为何不用一个进程去判断而要用多线程?
答:一个进程掉用rpc里面的一个函数,在rpc死后如果调用,调用者无法退出终端,也死在那儿了.
问:为何不用多进程?
答:多进程不太熟悉,尝试失败。
最后:选择了多线程。。。
多线程的大致流程:
一个线程睡觉,一个干事情,干不动事情,睡觉的线程杀了干事情的线程。。。^_^(有趣)
#!/bin/sh
state=`/usr/local/bin/test_rpc_server_62 afeng@afeng.sina.net`;
if [ "$state" != "OK" ]; then
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
if [ -e /usr/local/etc/rc.d/entplatform_rpcserver.sh ]; then
sh /usr/local/etc/rc.d/entplatform_rpcserver.sh
else
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
cat /etc/rc.local |grep rpc |sh
fi
echo "rpc bad, restart.";
else
echo "rpc ok.";
fi
state=`/usr/local/bin/test_rpc_server_62 afeng@afeng.sina.net`;
if [ "$state" != "OK" ]; then
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
if [ -e /usr/local/etc/rc.d/entplatform_rpcserver.sh ]; then
sh /usr/local/etc/rc.d/entplatform_rpcserver.sh
else
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
cat /etc/rc.local |grep rpc |sh
fi
echo "rpc bad, restart.";
else
echo "rpc ok.";
fi
shell如,一行搞定:
grep '|'`date +20%y-%m-%d`' ALL FUNISHED! |' /data0/daemon_log/popularity/addScoreOnline.log >> /data0/daemon_log/popularity/addScoreOnlineSh.log
shell字符串相连:
A=EDIT
N=1
B=$A$N
echo $B
N=1
B=$A$N
echo $B
c程序:
/* multiple thread programming in freebsd
*author : xiangdong2,zhirui
*E-mail : xiangdong2@staff.sina.com.cn zhirui@staff.sina.com.cn
*/
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
//////////////xiangdong/////////////////////////
#include "clientlib.h"
#include "clnt_ent_rpcserver.h"
////////////////////////////////////////////////
pthread_t thread[2];
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_t th;
char emailAddr[128] = {0};
int ret = 0;
void* rpcCheck(void *arg);
void *thread1()
{
sleep(1);
if(ret <= 0)
{
printf("The Rpc be down..........\n");
pthread_cancel(th);
pthread_exit(NULL);
}else{
switch(ret)
{
case QERR_OK:
printf("OK\n");
break;
case QERR_SERVER:
printf("QERR_SERVER\n");
break;
case QERR_MEMORY:
printf("QERR_MEMORY\n");
break;
case QERR_HASH:
printf("QERR_HASH\n");
break;
case QERR_MYSQL:
printf("QERR_MYSQL\n");
break;
case CANTCONNECTSERVER:
printf("CANTCONNECTSERVER\n");
break;
default:
printf("Other error\n");
break;
}
}
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
{
printf("线程1创建失败!\n");
}
else
{
//printf("线程1被创建\n");
}
if((temp = pthread_create(&thread[1], NULL, rpcCheck, NULL)) != 0) //comment3
printf("线程2创建失败!\n");
/*
else
printf("线程2被创建\n");
*/
}
void thread_wait(void)
{
if(thread[0] !=0)
{
pthread_join(thread[0],NULL);
}
}
void* rpcCheck(void* arg)
{
th=pthread_self();
ENTERPRISE ent;
ENTDOMAIN dm;
EMAIL em;
ENTINFO ei;
char email[128] = {0};
snprintf(email, sizeof(email) - 1, "%s", emailAddr);
em.projectid = ent.projectid = dm.projectid = 1;
em.method = BY_EID + 1;
strcpy(em.email, email);
pthread_detach(pthread_self());
pthread_mutex_lock(&mut);
ret = ent_rpc_getemail(&em);
pthread_mutex_unlock(&mut);
}
int main(int argc, char* argv[])
{
//帮助提示
if(argc != 2)
{
printf("用法:%s <邮件地址>\n", argv[0]);
printf("返回值说明:\n");
printf("OK --- 有效的邮件地址\n");
printf("QERR_SERVER --- RPC服务器内部错误\n");
printf("QERR_MEMORY --- RPC内存错\n");
printf("QERR_HASH --- RPC内部HASH错\n");
printf("QERR_MYSQL --- 无效的邮件地址\n");
printf("CANTCONNECTSERVER 连接RPC服务器失败\n");
return 0;
}
snprintf(emailAddr, sizeof(emailAddr) - 1, "%s", argv[1]);
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
//printf("我是主函数哦,我正在创建线程,呵呵\n");
thread_create();
//printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
thread_wait();
return 0;
}
*author : xiangdong2,zhirui
*E-mail : xiangdong2@staff.sina.com.cn zhirui@staff.sina.com.cn
*/
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
//////////////xiangdong/////////////////////////
#include "clientlib.h"
#include "clnt_ent_rpcserver.h"
////////////////////////////////////////////////
pthread_t thread[2];
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_t th;
char emailAddr[128] = {0};
int ret = 0;
void* rpcCheck(void *arg);
void *thread1()
{
sleep(1);
if(ret <= 0)
{
printf("The Rpc be down..........\n");
pthread_cancel(th);
pthread_exit(NULL);
}else{
switch(ret)
{
case QERR_OK:
printf("OK\n");
break;
case QERR_SERVER:
printf("QERR_SERVER\n");
break;
case QERR_MEMORY:
printf("QERR_MEMORY\n");
break;
case QERR_HASH:
printf("QERR_HASH\n");
break;
case QERR_MYSQL:
printf("QERR_MYSQL\n");
break;
case CANTCONNECTSERVER:
printf("CANTCONNECTSERVER\n");
break;
default:
printf("Other error\n");
break;
}
}
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
{
printf("线程1创建失败!\n");
}
else
{
//printf("线程1被创建\n");
}
if((temp = pthread_create(&thread[1], NULL, rpcCheck, NULL)) != 0) //comment3
printf("线程2创建失败!\n");
/*
else
printf("线程2被创建\n");
*/
}
void thread_wait(void)
{
if(thread[0] !=0)
{
pthread_join(thread[0],NULL);
}
}
void* rpcCheck(void* arg)
{
th=pthread_self();
ENTERPRISE ent;
ENTDOMAIN dm;
EMAIL em;
ENTINFO ei;
char email[128] = {0};
snprintf(email, sizeof(email) - 1, "%s", emailAddr);
em.projectid = ent.projectid = dm.projectid = 1;
em.method = BY_EID + 1;
strcpy(em.email, email);
pthread_detach(pthread_self());
pthread_mutex_lock(&mut);
ret = ent_rpc_getemail(&em);
pthread_mutex_unlock(&mut);
}
int main(int argc, char* argv[])
{
//帮助提示
if(argc != 2)
{
printf("用法:%s <邮件地址>\n", argv[0]);
printf("返回值说明:\n");
printf("OK --- 有效的邮件地址\n");
printf("QERR_SERVER --- RPC服务器内部错误\n");
printf("QERR_MEMORY --- RPC内存错\n");
printf("QERR_HASH --- RPC内部HASH错\n");
printf("QERR_MYSQL --- 无效的邮件地址\n");
printf("CANTCONNECTSERVER 连接RPC服务器失败\n");
return 0;
}
snprintf(emailAddr, sizeof(emailAddr) - 1, "%s", argv[1]);
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
//printf("我是主函数哦,我正在创建线程,呵呵\n");
thread_create();
//printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
thread_wait();
return 0;
}
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1273/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2009-4-21 15:36
评论列表