为什么要使用mmap进行IPC呢,个人总结有三点:
- 接口简单好用
- 多进程操作同一文件的时候使用mmap维护一下读写信息的meta数据非常方便
- 方便在非亲属进程间同步时使用
为什么要用posix semaphore进程同步呢,个人总结有三点:
- 接口简单好用
- 效率高,在Linux3.2.0开销只有0.41个Clock(而XSI semaphore有7.33)
- 方便在非亲属进程间同步时使用
为什么要两个结合起来用呢,因为我的应用场景是:两个没有亲戚关系的进程,同时读写一个meta数据,既需要IPC也需要同步,由于没有亲戚关系所以要使用named mmap存放posix semaphore的信号量指针(sem_t*,如果使用unamed semaphore的话),在创建mmap的时候需要设置flag为MAP_SHARED(如果还设置了MAP_ANONYMOUS则顾名思义是unamed mmap一般是在有亲戚关系进程间使用,或者同一进程的线程中使用),设置成MAP_SHARED之后可以认为是立即写回,也就是说对内存的操作等效于直接操作文件。使用named mmap的时候需要先创建一个文件,然后在使用mmap,第一次mmap之前需要设置文件大小,不然在第一次引用该mmap指针的时候会出现错误(这里我踩过坑,而且文件是否可读可写与mmap的时候最好一致),在下面的代码中会有详细注释。关于mmap的接口可以参考APUE,下面代码中也会。
posix semaphore有两种使用方式,一种是named semaphore另一种就是unnamed semaphore,它们创建与销毁接口不一样,关于posix semaphore的接口可以参考APUE,然后这里和这里都非常详细介绍了命名posix semaphore和内存中非命名posix semaphore的使用方法。
named semaphore使用的时候需要相关进程都使用同一名字,那各个毫无亲戚关系的进程这么知道使用改名字打了哪个信号量文件呢?在/dev/shm中会存放一个sem file,比如如果使用"mutex"作为semaphore名字的时候,在/dev/shm会创建一个sem.mutex的文件,其它进程在使用"