24) or die "receive message failed: $!";
print "BUFFER: ",$buf,"\n";
my $pos = index($buf, "end", 0);
print "POS: ",$pos,"\n";
if ($pos != -1)
{
$running = 0;
}
}
$msg->remove();
发送端采用C代码实现
msg_snd.c
#include
#include
#include
#include
#include
#define MAX_TEXT 512
struct my_msg_st
{
long int my_msg_type;
char some_text[MAX_TEXT];
};
int main()
{
int index;
struct my_msg_st some_data;
int msgid;
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if (msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);
}
for (index = 0; index < 10; index++)
{
memset(some_data.some_text, 0, MAX_TEXT);
some_data.my_msg_type = 1;
snprintf(some_data.some_text,MAX_TEXT, "%s~%d","index",index);
if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
}
/* ending */
memset(some_data.some_text, 0, MAX_TEXT);
some_data.my_msg_type = 1;
snprintf(some_data.some_text,MAX_TEXT, "%s","end");
if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
编译与运行:
$gcc -g -Wall -o msg_snd msg_snd_c.c
$./msg_rcv.pl &
$./msg_snd
输出:
MSG_ID: 393219
BUFFER: index~0
BUFFER: index~1
BUFFER: index~2
BUFFER: index~3
BUFFER: index~4
BUFFER: index~5
BUFFER: index~6
BUFFER: index~7
BUFFER: index~8
BUFFER: index~9
BUFFER: end