同步方式。
之前使用的是文件。
测试一下使用消息队列的方式。
相当简单。因为消息队列读取时可以选择阻塞方式,读取后消息自动删除。
用perl程序来发送消息
#!/usr/bin/perl
use strict;
use warnings;
use IPC::SysV qw(IPC_PRIVATE S_IRWXU S_IRWXG S_IRWXO IPC_CREAT IPC_NOWAIT);
use IPC::Msg;
my ($key,$msg,$msgtype,$buf);
#$key = IPC::SysV::ftok("11000",'a');
$key=120; #共享内存的key值,可以根据规则约定.
$msg =new IPC::Msg($key,0666|IPC_CREAT) or die "create message queue:$!";
$msgtype = 1; #队列中的消息类型,可以作为消息的标识
$msg->snd($msgtype,"test",IPC_NOWAIT) or die "send message failed:$!";
#$msg->rcv($buf,1024) or die "receive message failed:$!"; #自己读。c会先读到,这里就会阻塞
print $buf,"/n";
#$msg->remove; #销毁队列
用c程序来接收
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSZ 4096
struct msg{ /* 声明消息结构体 */
long msg_types; /* 消息类型成员 */
char msg_buf[511]; /* 消息 */
};
int main ( void )
{
int qid;
key_t key;
int len;
struct msg pmsg;
key = 120;
qid=msgget( key, IPC_CREAT | 0666 ) ; /* 创建一个消息队列 */
if ( qid < 0 ) { /* 创建一个消息队列失败 */
perror ( "msgget" );
exit (1) ;
}
printf ("created queue id : %d /n", qid ); /* 输出消息队列的 ID */
system( "ipcs -q" ); /* 查看系统 IPC 的状态 */
/* 从指定队列读取消息 */
len = msgrcv ( qid, &pmsg, BUFSZ, 0, 0 );
if ( len > 0 ){
pmsg.msg_buf[len] = '\0'; /* 为消息添加结束符 */
printf ("reading queue id :%05ld\n", qid ); /* 输出队列 ID*/
/* 该消息类型就是发送消息的进程 ID*/
printf ("message type : %05ld\n", pmsg.msg_types );
printf ("message length : %d bytes\n", len ); /* 消息长度 */
printf ("mesage text: %s\n", pmsg.msg_buf); /* 消息内容 */
}
else if ( len == 0 )
printf ("have no message from queue %d\n", qid );
else {
perror ( "msgrcv");
exit (1);
}
system("ipcs -q")
exit ( 0 ) ;
}
互相通信没有问题。
c先启动后启动都可以,会阻塞读。
一旦运行perl程序,c读到消息则退出。(每次都是c先读到)
linux默认队列数为16,可以最大调到2g,但是实际用到32k左右就不能创建了
msgtype一般是消息的优先级,一种类型的消息可以有多个,消息个数和大小的限制是一样的,默认为64k