当前位置:  技术问答>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 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 紧急求助,创建socket失败!!
  • 求助!fedora13 下安装软件总是失败
  • 求助:函数getpeername()返回的namelen很小,导致获得名字失败是为什么?谢谢!!!
  • 【求助】软件包安装失败
  • 求助:sendmail发信失败
  • ubuntu10.04通过U盘安装失败。求助一下。
  • 求助!centOs系统root用户连接ftp失败,别的用户连接ftp成功?
  • (求助)启动vsftpd失败
  • 求助:mount 执行失败!多谢!
  • 求助:请问怎么获得在个一个脚本中执行的另外个脚本的返回结果,如执行成功或失败
  • 向高手求助一个简单问题:为什么我在linux上的socket编程bind失败,告诉是权限不允许?
  • 崩溃了阿,tftp配置总是失败,求助!!
  • 【求助】system()命令执行失败,请高手帮忙解决,谢谢!
  • 【诚意求救】小弟一台Web服务器上ProFTP服务启动失败,现给出错误信息,求助于高手
  • insmod 失败,问题很奇怪,方法用尽,求助
  • 求助:为什么我我在MAC OS上 执行ioctl 函数SIOCGIFADDR的命令获取IP地址失败呢?
  • s3c2410ARM学习板NFS挂载失败,主机不能发现目标板,求助!! iis7站长之家
  • 若干次尝试失败后,只好求助各位大哥了
  • s3c2410ARM学习板NFS挂载失败,主机不能发现目标板,求助!!
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题
  • 求助:信号 --13 进程中断


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3