快速业务通道

LINUX进程控制(3)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-18
.

  参数shmaddr通常应该是shmget的成功返回值.

  函数shmctl可以删除共享内存段.

  参数shmid是共享内存段标识;

  参数cmd是对共享内存段的操作方式,可选为IPC_STAT,IPC_SET,IPC_RMID

  参数buf是表示共享内存段的信息结构体数据.

  例如shmctl(kshareMem,IPC_RMID,NULL)表示删除调共享内存段kHareMem

  示例:

  #include <sys/types.h>

  #include <sys/ipc.h>

  #include <sys/shm.h>

  #include <stdio.h>

  #include <string.h>

  #include <unistd.h>

  bool IsStr(const char *pszBuf,int iMaxSize)

  {

  while(iMaxSize-->0 && *pszBuf );

  return *(pszBuf-1)==0;

  }

  int main(int argc, char *argv[])

  {

  const int BUF_SIZE=4000;

  FILE *pStream;

  key_t kShareMem;

  int iShareMem;

  char *pszBuf;

  //

  if(argc!=2 || strcmp(argv[1],"read")!=0

  && strcmp(argv[1],"write")!=0){

  printf("Usage:ShareMem <read|write>\n");

  return -1;

  }

  pStream=fopen("./a.bin","ab");

  if(pStream)

  fclose(pStream);

  kShareMem=ftok("./a.bin",''a'');

  if(kShareMem==-1){

  perror("ftok fail.");

  return -2;

  }

  iShareMem=shmget(kShareMem,BUF_SIZE,0666|IPC_CREAT);

  if(iShareMem<0){

  perror("shmget fail.");

  return -3;

  }

  pszBuf=(char *)shmat(iShareMem,0,0);

  if(pszBuf==(char *)-1){

  perror("shmat fail.");

  return -4;

  }

  if(strcmp(argv[1],"write")==0){

  while(fgets(pszBuf,256,stdin));

  }else{

  char szOld[256]={0};

  while(true){

  if(IsStr(pszBuf,256) &&

  strcmp(szOld,pszBuf)!=0){

  strcpy(szOld,pszBuf);

  printf("%s",szOld);

  }

  usleep(100*1000);

  }

  }

  shmdt(pszBuf);

  return 0;

  }

  5.6. 消息队列

  消息队列与FIFO很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列中读取信息.但FIFO需要读、写的两端事先都打开,才能够开始信息传递工作.而消息队列可以事先往队列中写信息,需要时再打开读取信息.

  5.6.1. 初始化消息队列

  与共享内存相似,可以用msgget创建或者打开一个消息队列.

  原型:

  #include <sys/types.h>

  #include <sys/ipc.h>

  #include <sys/msg.h>

  int msgget(key_t key, int msgflg);

  参数key是唯一标识一个消息队列的关键字,如果为IPC_PRIVATE(值为0),表示创建一个只由调用进程使用的消息队列,非0值的key表示创建一个可以被多个进程共享的消息队列;

  参数msgflg指明队列的访问权限和创建标志,创建标志的可选值为IPC_CREAT和IPC_EXCL如果单独指定IPC_CREAT,msgget要么返回新创建的消息队列id,要么返回具有相同key值的消息队列id;如果IPC_EXCL和IPC_CREAT同时指明,则要么创建新的消息队列,要么当队列存在时,调用失败并返回-1.

  示例:

  #include <stdio.h>

  #include <sys/types.h>

  #include <sys/ipc.h>

  #include <sys/msg.h>

  int main()

  {

  key_t key; //消息队列关键字

  int iMode; //消息队列读写权限

  int iFlag; //创建标志位

  int iMsgQueId; //消息队列ID

  //输入关键字值

  printf("Enter the disired key i

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号