IP phone日志2

昨天把socket学习了一下:
今天开始学习queue.
以下是queue.c代码
**********************************************************
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

#define MSG_MAX 4056 // <= 4056  max size of message (bytes)


/* message buffer for msgsnd and msgrcv calls */ //定义的信息
struct sMsgBuf {
  long mtype; // type of message
  long ModuleID;//module ID
  char mtext[MSG_MAX]; //message text */
};

//创建queue
int open_queue( key_t keyval )
{
  int qid;
  if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
    {
      return(-1);
    }
  return(qid);
}


//send queue message
//qid = queue id
//qbuf = send message buffer
int send_message( int qid, struct sMsgBuf *qbuf )
{
  int result, length;
  /* The length is essentially the size of the structure minus sizeof(mtype) */
  length = sizeof(struct sMsgBuf) - sizeof(long);
  if((result = msgsnd( qid, qbuf, length, 0)) == -1)
    {
      return(-1);
    }
  return(result);
}

//read queue message
//qid = queue id
//type = message type
//qbuf = read message buffer
//return int = err code
int read_message( int qid, long type, struct sMsgBuf *qbuf )
{
  int result, length;
  /* The length is essentially the size of the structure minus sizeof(mtype) */
  length = sizeof(struct sMsgBuf) - sizeof(long);
  if((result = msgrcv( qid, qbuf, length, type, 0)) == -1)
    {
      return(-1);
    }
  return(result);
}

//查看队列是否有消息
int peek_message( int qid, long type )
{
  int result, length;

//忽略了缓冲区的地址和长度。这样,系统调用将会失败。尽管如此,
//可以检查返回的E 2 B I G值,它说明符合条件的消息确实存在。
  if((result = msgrcv( qid, NULL, 0, type, IPC_NOWAIT)) == -1)
    {
      if(errno == E2BIG)
        return 1;
    }
  return 0;
}

//sample queue
int CreateQue()
{
  int qid;
  key_t msgkey;

  struct sMsgBuf msgbuf;
  /* Generate our IPC key value */
  msgkey = ftok(".", 'm');
  /* Open/create the queue */
  if(( qid = open_queue( msgkey)) == -1) {
    perror("open_queue");
    exit(1);
  }
 msgbuf.mtype = 1;
  msgbuf.ModuleID=100;
  strcpy(msgbuf.mtext,"love");
  if((send_message( qid, &msgbuf )) == -1) {
    perror("send_message");
    exit(1);
  }
}

int get_queue_ds( int qid, struct msqid_ds *qbuf )
{
  if( msgctl( qid, IPC_STAT, qbuf) == -1)
    {
      return(-1);
    }
  return(0);
}
int change_queue_mode( int qid, char *mode )
{
  struct msqid_ds tmpbuf;
  /* Retrieve a current copy of the internal data structure */
  get_queue_ds( qid, &tmpbuf);
  /* Change the permissions using an old trick */
  sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);
  /* Update the internal data structure */
  if( msgctl( qid, IPC_SET, &tmpbuf) == -1)
    {
      return(-1);
    }
  return(0);
}

int Remove_queue(int qid )
{
  if( msgctl( qid, IPC_RMID, 0) == -1)
  {
      return(-1);
  }
  return(0);
  //(void)msgctl(qid,IPC_RMID,0);
}


**********************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值