linux編程之共享內存、消息隊列、管道

POSIX共享內存
共享內存的訪問同步問題必須由程序員負責,可選的同步方式有互斥鎖、條件變量、讀寫鎖、記錄鎖、信號量。
頭文件:#include<sys/mman.h>
void *mmap(void *addr,size_t len,int prot,int flag,int filedes,off_t off);該函數的做用是把一個文件或共享內存區對象映射到進程的地址空間
addr:指向映射存儲區的起始位置,通常設爲NULL,這時內核在合適的地址創建映射
len:映射的字節數
prot:映射存儲區的保護要求,可能取值PROT_EXEC、PROT_READ、PROT_WRITE、PROT_NONE
flag:標誌位,可能取值MAP_SHARED、MAP_PRIVATE
filedes:要被映射文件的描述符
off:從文件的什麼位置開始映射,必須是頁大小的整數倍
 
int munmap(caddr_t addr,size_t len);解除存儲映射
int msync(void *addr,size_t len,int flags);同步文件到存儲器
void *memcpy(void *dest,const void *src,size_t len);複製映射存儲區
int shm_open(const char *name,int oflag,mode_t mode);打開或建立共享內存區對象
 
消息隊列
頭文件:mqueue.h   fcntl.h    sys/stat.h
mq_open用於建立一個新隊列或打開一個已經存在的隊列
mq_close關閉隊列
mq_unlink刪除隊列
示例: 
int flags;
mqd_t mqd;
flags=O_RDWR | O_CREAT | O_EXCL;
mqd=mq_open("/tmp.txt",flags,0644,NULL);
mq_send:向隊列中加入一條消息
mq_receive:從隊列讀出一條消息


管道
管道是一對文件描述符,全部可以操做文件描述符的函數都適用於管道,包括select,read,write,fcntl等
頭文件:unistd.h    sys/types.h    sys/stat.h
int pipe(int dfs[2]); 建立匿名管道
int mkfifo(const char *pathname,mode_t mode);建立一個命名管道

//父子進程間利用管道通訊
int main()
{
  int myPipe[2],ret;
  char buf[MAX_LINE+1] = {0};
  char testbuf[]="a test string";
  if(pipe(myPipe)==0)
  {
    if(fork()==0)
    {
      printf("You have enter the child process\n");
      ret=read(myPipe[0],buf,MAX_LINE);
      buf[ret]='\0';
    }
    else{
      ret=write(myPipe[1],testbuf,strlen(testbuf));
      ret=wait(NULL);//等待子進程退出,防止出現殭屍進程,也能夠用waitpid
       }
  }
  close(myPipe[0]);
  close(myPipe[1]);
  return 0;
}
           
相關文章
相關標籤/搜索