当前位置: 技术问答>linux和unix
[急切求助]IPC消息队列写失败时,如何清空队列中的数据?
来源: 互联网 发布时间:2016-09-21
本文导语: cap.c和map.c两个进程用非阻塞模式,通过消息队列通信; 如果cap.c发现写失败,想把cap.c写进去的所有数据删除, 或者把cap.c和map.c写进去的数据都删除? 如何操作? 还有就是如何设置缓冲队列的大小和可存储消息的数量? /**...
cap.c和map.c两个进程用非阻塞模式,通过消息队列通信;
如果cap.c发现写失败,想把cap.c写进去的所有数据删除,
或者把cap.c和map.c写进去的数据都删除?
如何操作?
还有就是如何设置缓冲队列的大小和可存储消息的数量?
/****** cap.c ******/
#include
#include
#include
#include
#include
#include
#include
#define PROJID 0x9091
#define DATA_SIZE 256
#define SNDMSG 1
#define RCVMSG 2
int mqid;
key_t mqkey;
char filenm[] = "shared-file.txt";
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[DATA_SIZE]; /* message data */
}msg;
/*收到Ctrl+C或Kill消息,删除消息队列*/
void terminate_handler(int signo)
{
msgctl(mqid, IPC_RMID, NULL);
exit(0);
}
/*-1表示初始化失败,0表示成功*/
int capInit()
{
mqkey = ftok(filenm, PROJID);
if (mqkey == -1) {
perror("ftok error: ");
return -1;
}
mqid = msgget(mqkey, IPC_CREAT | IPC_EXCL | 0666);
if (mqid == -1) {
perror("msgget error: ");
return -1;
}
return 0;
}
int capSendData(char *msgToSend)
{
int sendResult = -2;
msg.mtype = SNDMSG;
strcpy(msg.mtext,msgToSend);
sendResult = msgsnd(mqid, &msg, strlen(msg.mtext) + 1, IPC_NOWAIT);
return sendResult;
}
int capRecvData()
{
int rcvMsgLen = -2;
rcvMsgLen = msgrcv(mqid, &msg, DATA_SIZE, RCVMSG, IPC_NOWAIT);
return rcvMsgLen;
}
int main(void)
{
int initValue =-2;
int recdDataLen = -1;
int sendDataLen = -1;
initValue = capInit();
if (initValue == -1)
{
printf("Init Failed!n");
}
else
{
printf("Init Succeed!n");
}
/*捕获Ctrl+C和Kill消息*/
signal(SIGINT, terminate_handler);
signal(SIGTERM, terminate_handler);
while (1) {
/*发送消息*/
char buf[50];
memset(buf,0,sizeof(buf));
strcpy(buf,"Hi,MAP!");
sendDataLen = capSendData(buf);
if (sendDataLen 0)
{
printf("msg From Map: %sn", msg.mtext);
}
else
{
printf(" no data to read n");
}
}
}
/////////////////////////////////////////////////////////////////////
/****** cmap.c ******/
#include
#include
#include
#include
#include
#include
#include
#define PROJID 0x9091
#define DATA_SIZE 256
#define SNDMSG 1
#define RCVMSG 2
int rcvMsgLen;
int mqid;
char filenm[] = "shared-file.txt";
key_t mqkey;
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[DATA_SIZE]; /* message data */
}msg;
/*返回-1失败,0成功*/
int mapInit()
{
mqkey = ftok(filenm, PROJID);
if (mqkey == -1) {
perror("ftok error: ");
return -1;
}
mqid = msgget(mqkey, 0);
if (mqid == -1) {
perror("msgget error: ");
return -1;
}
return 0;
}
int mapRecvData()
{
int retVal = -1;
retVal = msgrcv(mqid, &msg, DATA_SIZE, SNDMSG, 0);
return retVal;
}
int mapSendData(char *msgToSend)
{
int sendVal = -1;
msg.mtype = RCVMSG;
strcpy(msg.mtext,msgToSend);
sendVal = msgsnd(mqid, &msg, strlen(msg.mtext) + 1, 0);
}
int main(void)
{
int initVal = -1;
initVal = mapInit();
int recvDataLen = -1;
int sendDataLen = -1;
if (initVal == -1)
{
printf("Init Failed n");
}
else
{
printf("Init Succeed n");
}
while (1) {
/*接收消息*/
recvDataLen = mapRecvData();
if (recvDataLen > 0)
{
printf("msg From CAP: %sn", msg.mtext);
}
else
{
printf(" no data to readn");
}
/*发送消息*/
char buf[50];
memset(buf,0,sizeof(buf));
strcpy(buf,"Hellp,CAPn");
sendDataLen = mapSendData(buf);
if (sendDataLen