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;
}
           
相关文章
相关标签/搜索