LINUX进程控制(3)
.
参数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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |