Posted on 2008-08-26 16:06
Prayer 阅读(443)
评论(1) 编辑 收藏 引用 所属分类:
LINUX/UNIX/AIX
其他的不管,只是关注一下alarm的用法,设定了msgrcv超时。
环境是redhat9
当把发送缓冲中写入大于8位数据时 可以成功发送但只能收到8位信息
代码如下
//定义
struct msgbuf //消息结构
{
long mtype;
char mtext[100];
}msgbuf;
//创建消息队列
void creatque()
{
static int msg_que_id=-1;
struct sigaction action;
/*检查是否存在的要创建的消息队列,如果存在到 就删除它*/
msg_que_id=msgget(BOOKING_KEY,0);
if(msg_que_id!=-1){
if(msgctl(msg_que_id,IPC_RMID,0)==-1){
perror("remove old message");
exit(1);
}
}
/*创建消息队列*/
msg_que_id=msgget(BOOKING_KEY,IPC_CREAT|0666);
if(msg_que_id==-1){
perror("creat new message list");
exit(1);
}
/*忽略其它一些参数*/
action.sa_handler=SIG_IGN;
action.sa_flags=0;
sigemptyset(&action.sa_mask);
sigaction(SIGINT,&action,NULL);
sigaction(SIGQUIT,&action,NULL);
sigaction(SIGHUP,&action,NULL);
}
//发消息
void control(char *c)
{
int send_len;
int msg_que_id=-1;
struct msgbuf send_msg;
memset(send_msg.mtext,'\0',sizeof(send_msg.mtext));
send_len=sizeof(long)+sizeof(int);
msg_que_id=msgget(BOOKING_KEY,0);
if(msg_que_id==-1){
perror("get message list id");
exit(1);
}
if(!strncasecmp(c,"lk",2)){/*连接状态信号*/
send_msg.mtype=httpd_stoped;
sprintf(send_msg.mtext,"linking");
if(msgsnd(msg_que_id,&send_msg,send_len,0)<0){
perror("send message");
exit(1);
}
}
}
//接收消息
void *other_key(void *data)
{
int msg_que_id=-1;
int rece_len,send_len;
struct msgbuf rece_msg;
memset(rece_msg.mtext,'\0',sizeof(rece_msg.mtext));
send_len=sizeof(long)+sizeof(int);
msg_que_id=msgget(BOOKING_KEY,0);
if(msg_que_id==-1){
perror("get message list id");
exit(1);
}
while(1){
/*定时器定时LKTIMEOUTs来接收30s一次的连接状态信号,*/
/*如果时间到而没有接收到信号则判断接收方关闭了监视端,服务器将中断此次连接*/
alarm(35);
rece_len=msgrcv(msg_que_id,&rece_msg,sizeof(msgbuf)-sizeof(long),(int)httpd_stoped,0);
if(rece_len<0){
perror("receive message");
exit(1);
}
if(!strcmp(rece_msg.mtext,"linking")){
alarm(0);
}
else if(!strcmp(rece_msg.mtext,"q")){
if(msgsnd(msg_que_id,&rece_msg,send_len,0)<0){/*把取出的结束信息再写回去(因为一条信息只能被取一次)*/
perror("send message"); /*而取出一次只能结束一个进程*/
exit(1);
}
exit(1);
}
}
}