linux挂起datasend进程,linux进程间通信 消息队列

消息队列

消息队列是消息的链接表,存放在内核中并有消息队列标识符标识。

int msgget(key_t key,int flag) 用于创建一个新队列或打开一个现存的队列。

int msgsend(int msqid,void *ptr,size_t bytes,int flag)将新消息增加到队列尾端。每个消息包含一个正长整型类型字段,一个非负长度以及实际数据字节,所有这些都在将消息增加到

队列时,传送给msgsend。

msqid为消息队列id,ptr为指向要发送的消息地址的指针,消息的结构可定义为

struct msg

{

int type;

char buf[20];

};

bytes为发送消息有字节数,flag为发送标识,可以为IPC_NOWAIT。IPC_NOWAIT的作用,若消息队列已满,IPC_NOWAIT使得msgsend立即出错返回。若不指定IPC_NOWATI标识,进程阻塞到出现

下述情况之一出现位置:1.有空间容纳消息了 2.系统删除队列 3.捕捉到一个信号,并从处理程序返回。

ssize_t msg_rcv(int msqid,void *ptr,size_t bytes,long type,int flag)用于从队列中取消息。

对msg_rcv()中的参数理解参看msg_send()中的参数。

int msgctl(int msqid,int cmd,struct msqid_ds *buf)此函数类似于ioctl函数。(垃圾桶函数)

cmd有一下三中值:

IPC_STAT:取队列的struct_ds结构,放在buf所指的结构中

IPC_SET:与IPC_STAT相反

IPC_RMID:从系统中删除该消息队列以及仍在队列中的消息

struct msqid_ds{

struct ipc_perm msg_perm;

msgqnum_t msg_qnum;

......

};

注意:我们并不一定要以先进先出的次序取消息,也可以按消息的类型字段取消息。

//msg_send.c

#include#include#include#include#include#include#include

struct msg_buf

{

int type;

char data[255];

};

int main()

{

key_t key;

int msgid;

int ret;

struct msg_buf msgbuf;

key=ftok("/etc/passwd",255);

printf("key=%d\n",key);

msgid=msgget(key,IPC_CREAT|0666);

if(msgid==-1)

{

perror("create error");

exit(1);

}

msgbuf.type=1;

strcpy(msgbuf.data,"test ha");

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

msgbuf.type=2;

strcpy(msgbuf.data,"test hello");

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

msgbuf.type=3;

strcpy(msgbuf.data,"test hi");

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

return 0;

}

//msg_reciece.c

#include#include#include#include#include#include#include

struct msg_buf

{

int type;

char data[255];

};

int main()

{

key_t key;

int msgid;

int ret;

struct msg_buf msgbuf;

key=ftok("/etc/passwd",255);

msgid=msgget(key,0666);

if(msgid==-1)

{

perror("create error");

exit(1);

}

memset(&msgbuf,0,sizeof(msgbuf));

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),3,IPC_NOWAIT);

printf("recieve msg=%s\n",msgbuf.data);

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),2,IPC_NOWAIT);

printf("recieve msg=%s\n",msgbuf.data);

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),1,IPC_NOWAIT);

printf("recieve msg=%s\n",msgbuf.data);

msgctl(msgid,IPC_RMID,0);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值