进程间通信方式预习2

1.接口mmap()的使用方法

mmap()系统调用使得进程之间可以通过映射同一个普通文件实现共享内存,普通文件被映射到地址空间后,进程可以向访问普通文件一样对文件进行访问,不必再调用read(),writr()等操作。Mmap()系统调用并不完全是用于共享内存设计的,它本身提供了不同于一般对普通文件的访问形式,进程可以像读写内存一样对普通文件的操作,而posix或系统v的共享内存ipc则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。

2.系统调用mmap()用于共享内存的两种方法

1.使用普通文件提供的内存映射,适用于任何进程之间,此时需要打开或创建一个文件,然后再调用mmap(),典型代码如下:

Fd = open(name, flag, mode);

If (fd < 0

Ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

2.用特殊文件提供匿名内存映射,适用于具有血缘关系的进程之间,由于父子进程特殊的亲缘关系,在父进程中现调用mmap(),然后调用fork,那么在调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样父进程就可以通过映射区域进行通信了,注意,这里不是一般的继承关系,一般来说,子进程单独维护从父进程继承下来的一些变量,而mmap()返回的地址,却由父子进程共同维护。

扫描二维码关注公众号,回复: 2222343 查看本文章

对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式,此时不必指定具体的文件,只要设置相应的标志即可。

3.系统V共享内存与系统调用mmap()原理上的区别

系统V共享内存指的是把所有共享数据放在共享内存区域,任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。

系统调用mmap()通过映射一个普通文件实现共享内存,系统V则是通过映射特殊文件系统shm中的文件实现进程间共享内存通信的,也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件。

4.系统vmmap()映射普通文件实现共享内存通信的对比

1.系统V共享内存中的数据,从来不写到实际磁盘文件中去,而通过mmap()映射普通文件实现的共享内存通信可以指定何时将数据写入磁盘文件中。

2.系统V共享内存是随内核持续的,即使所有访问共享内存的进程都已经正常终止,共享内存区仍然存在(除非显示删除共享内存),在内核重新引导之前,对该共享内存区域的任何该写操作都将一直保留。

3.通过调用mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时将终止对通信的影响,而通过系统V共享内存实现 通信的进程则不然。

5.从管道读取数据,读函数返回值意义

1.若管道写端不存在,则认为已经读到数据的末尾,读函数返回的读出字节数为0.

2.当管道写端存在,若请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,若不大于PIPE_BUF,则返回现有数据字节数(此时管道中数据量小于请求的数据量),或者返回请求的字节数(管道中数目不小于请求的数据量)。

6.向管道写数据的注意点

1.向管道中写数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写程序就会试图向管道中写入数据,如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。

只有在管道的读端存在时,向管道中写入数据才有意义,否则向管道中写入数据的进程将收到内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作是应用程序终止)。

7.向FIFO中写入数据的注意点

如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么该进程内的写操作设置了阻塞标志的写操作。

1.对于设置了阻塞标志的写操作

1.当写入数据不大于PIPE_BUF时,linux将保证写入的原子性,若管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到缓冲区中能够容纳要写入的字节数时,才开始进行一次性写操作。

2.当数据量大于PIPE_BUF时,linux不再保证写入的原子性,FIFO缓冲区一有空闲区域,写程序就会试图向管道写入数据,写操作在写完所以请求写的数据后返回。

2.对于没有设置阻塞标志的写操作

1.当要写入的数据量大雨PIPE_BUF时,linux不再保证写入的原子性,在写满所以FIFO空闲缓冲区后,写操作返回。

2.当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性,如果当前FIFO空闲缓冲区能够容纳请求的字节数,写完后成功返回,如果不能容纳下,则返回EAGAIN错误,提醒以后再写。

猜你喜欢

转载自blog.csdn.net/cb673335723/article/details/78675995
今日推荐