#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
int main(int argc, char *argv[]){
int ipc_key,msg_id,msg_len;
long mtype;
void * mbuf;
if(argc==5 && argv[3][0]=='s'){
ipc_key=atoi(argv[1]);
mtype=atol(argv[2]);
msg_len=strlen(argv[4]);
if ( 0>(msg_id=msgget(ipc_key, 0666|IPC_CREAT)))return 1;
if ( NULL==(mbuf=malloc(msg_len+sizeof(long)+1)) )return 2;
memcpy(mbuf, (void *)&mtype, sizeof(long) );
memcpy(mbuf+sizeof(long), (void *)argv[4], msg_len );
if ( 0>msgsnd(msg_id, (struct msgbuf *)mbuf, msg_len, 0) )return 3;
printf("Send Success.n");
}else if(argc==4 && argv[3][0]=='r'){
ipc_key=atoi(argv[1]);
mtype=atol(argv[2]);
if ( 0>(msg_id=msgget(ipc_key, 0666)))return 1;
if ( NULL==(mbuf=malloc(4096)) )return 2;
if ( 0>(msg_len=msgrcv(msg_id,(struct msgbuf *)mbuf, 4000, mtype, IPC_NOWAIT))){
printf("No message received.n");
return 3;
}
printf("Recv Success.(%d bytes):n",msg_len);
printf("%sn",(char *)(mbuf+sizeof(long)));
}else if(argc==3 && argv[2][0]=='c'){
ipc_key=atoi(argv[1]);
if ( 0>(msg_id=msgget(ipc_key, 0666)))return 1;
if ( 0>msgctl(msg_id,IPC_RMID,(struct msqid_ds *)mbuf) )return 2;
}else{
printf("usage:"
"%s key type s message --to send messagen"
"%s key type r --to receiven"
"%s key c --to clear queuen"
,argv[0],argv[0],argv[0]);
}
return 0;
}