免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1639 | 回复: 0
打印 上一主题 下一主题

Linux 多线程同步之消息队列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-04 23:23 |只看该作者 |倒序浏览
消息队列是消息的链表,存放在内核中并有消息队列标示符标示。
  msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;取消息很智能,不一定先进先出
  ①msgget,创建一个新队列或打开一个现有队列
  #include
  int msgget ( key_t key, int flag );
  //成功返回消息队列ID;错误返回-1
  ②msgsnd: 发送消息
  #include
  int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )
  //成功返回0,错误返回-1
  a:   flag可以指定为IPC_NOWAIT;  若消息队列已满,则msgsnd立即出错返回EABAIN;
  若没指定IPC_NOWAIT; msgsnd会阻塞,直到消息队列有空间为止
  ③msgrcv: 读取消息:
  ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag );
  a. type == 0; 返回消息队列中第一个消息,先进先出
  b. type > 0    返回消息队列中类型为tpye的第一个消息
  c. type
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #define   MSG_FILE "."
  #define   BUFFER 255
  #define   PERM S_IRUSR|S_IWUSR
  #define IPCKEY 0x111
  struct msgtype {
  long mtype;
  char buffer[BUFFER+1];
  };


  void* thr_test( void* arg ){
  struct msgtype msg;
  int msgid;
  msgid =  *((int*)arg);
  printf("msqid = %d  IPC_NOWAIT = %d\n", msgid, IPC_NOWAIT);
  time_t tt = time(0)+8;
  //while( time(0) <= tt )
  //{
  msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);
  fprintf(stderr,"Server Receive:%s\n", msg.buffer);
  msg.mtype = 2;
  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);
  //}
  pthread_exit( (void*)2 );
  }
  int main(int argc, char **argv)
  {
  struct msgtype msg;
  key_t key;
  int msgid;
  pthread_t tid;
  if(argc != 2)
  {
  fprintf(stderr,"Usage:%s string\n", argv[0]);
  exit(1);
  }
  /*
  char path[256];
  sprintf( path, "%s/", (char*)getenv("HOME") );
  printf( "path is %s\n", path );
  msgid=ftok( path, IPCKEY );
  */
  if((key=ftok(MSG_FILE,'a'))==-1)
  {
  fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
  exit(1);
  }
  if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)
  {
  fprintf(stderr,"Creat Message  Error:%s\n", strerror(errno));
  exit(1);
  }
  pthread_create( &tid, NULL, thr_test, &msgid );
  fprintf(stderr,"msid is :%d\n", msgid);
  msg.mtype = 1;
  strncpy(msg.buffer, argv[1], BUFFER);
  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);
  exit(0);
  }
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/106123/showart_2178140.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP