linux下perl和c进程通信

 

同步方式。

之前使用的是文件。

测试一下使用消息队列的方式。

相当简单。因为消息队列读取时可以选择阻塞方式,读取后消息自动删除。

用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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值