亚洲综合社区欧美综合色-欧美逼逼一区二区三区-国产老熟女高潮精品网站-国产日韩最新视频在线看

始創(chuàng)于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊有禮 登錄
  • 掛牌上市企業(yè)
  • 60秒人工響應(yīng)
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補(bǔ)償
全部產(chǎn)品
您的位置: 網(wǎng)站首頁 > 幫助中心>文章內(nèi)容

Linux多線程同步之消息隊(duì)列

發(fā)布時(shí)間:  2012/8/10 10:26:20
 消息隊(duì)列是消息的鏈表,存放在內(nèi)核中并有消息隊(duì)列標(biāo)示符標(biāo)示。

  msgget用于創(chuàng)建一個(gè)新隊(duì)列或打開一個(gè)現(xiàn)存的隊(duì)列。msgsnd將新消息加入到消息隊(duì)列中;每個(gè)消息包括一個(gè)long型的type;和消息緩存;msgrcv用于從隊(duì)列中取出消息;取消息很智能,不一定先進(jìn)先出

 、賛sgget,創(chuàng)建一個(gè)新隊(duì)列或打開一個(gè)現(xiàn)有隊(duì)列

  #include

  int msgget ( key_t key, int flag );

  //成功返回消息隊(duì)列ID;錯(cuò)誤返回-1

 、趍sgsnd: 發(fā)送消息

  #include

  int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )

  //成功返回0,錯(cuò)誤返回-1

  a: flag可以指定為IPC_NOWAIT; 若消息隊(duì)列已滿,則msgsnd立即出錯(cuò)返回EABAIN;

  若沒指定IPC_NOWAIT; msgsnd會(huì)阻塞,直到消息隊(duì)列有空間為止

  ③msgrcv: 讀取消息:

  ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag );

  a. type == 0; 返回消息隊(duì)列中第一個(gè)消息,先進(jìn)先出

  b. type > 0 返回消息隊(duì)列中類型為tpye的第一個(gè)消息

  c. type < 0 返回消息隊(duì)列中類型 <= |type| 的數(shù)據(jù);若這種消息有若干個(gè),則取類型值最小的消息

  消息隊(duì)列創(chuàng)建步驟:

  #define MSG_FILE "."

  struct msgtype {

  long mtype;

  char buffer[BUFFER+1];

  };

  if((key=ftok(MSG_FILE,'a'))==-1)

  {

  fprintf(stderr,"Creat Key Error:%sn", strerror(errno));

  exit(1);

  }

  if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

  {

  fprintf(stderr,"Creat Message Error:%sn", strerror(errno));

  exit(1);

  }

  msg.mtype = 1;

  strncpy(msg.buffer, argv[1], BUFFER);

  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

  msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);

  示例代碼:

  #include

  #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 = %dn", 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:%sn", 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 stringn", argv[0]);

  exit(1);

  }

  /*

  char path[256];

  sprintf( path, "%s/", (char*)getenv("HOME") );

  printf( "path is %sn", path );

  msgid=ftok( path, IPCKEY );

  */

  if((key=ftok(MSG_FILE,'a'))==-1)

  {

  fprintf(stderr,"Creat Key Error:%sn", strerror(errno));

  exit(1);

  }

  if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

  {

  fprintf(stderr,"Creat Message Error:%sn", strerror(errno));

  exit(1);

  }

  pthread_create( &tid, NULL, thr_test, &msgid );

  fprintf(stderr,"msid is :%dn", msgid);

  msg.mtype = 1;

  strncpy(msg.buffer, argv[1], BUFFER);

  msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

  exit(0);

  }


本文出自:億恩科技【1tcdy.com】

服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號
      1
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線