兄弟进程间通信:
需要注意关闭父进程的读端和写端。
有名管道fifo:
和匿名管道一样也是在内核空间创建一个缓冲区,但是区别在于这个管道有名。
命令创建:mkfifo …
函数原型:int mkfifo(const char* pathname, mode_t mode);
这个管道可以让两个没有血缘关系的进程间通信。
文件进程间通信:利用fork函数,父子进程之间共享文件描述符,也就共享了打开的文件。无血缘关系的进程也可以,简单来说就是两个进程访问同一个文件并往里写或读数据,也就类似于两个进程间通信了。(实质打开的文件是内核中的一块缓冲区)
共享内存映射
mmap函数:
void *mmap(void *addr, size_t length, int port, int flags, int fd, off_t offset);
参数:
addr:指定映射区的首地址。通常传NULL,表示让系统自动分配
length:共享映射区的大小(<=文件 的实际大小)
port:共享内存映射区的读写属性。PORT_READ,PORT_WRITE,PORT_READ|PORT_WRITE
flags:标注共享内存属性。MAP_SHARED MAP_PRIVATE
fd:用于创建共享内存映射区的那个文件 文件描述符
offset:默认0,表示映射文件的全部。偏移位置。需是4096的整数倍
返回值:
成功:映射区的首地址
失败:MAP_FAILED,errno
注意事项:文件必须有大小,不然出总线错误,创建映射区,至少需要read权限。mmap的读写权限,应该小于等于文件的open权限。只写不行。在打印时文件里的其它内容是打印不出来的只会打印出你创建出的那块映射区中的内容。
int munmap(void *addr, size_t length);//释放映射区
mmap建立父子进程间通信:
如果将mmap设置成私有权限,那么父进程中修改的内存空间只有父进程能使用,子进程修改内存空间也只是子进程能够使用。所以必须设置共享权限。然后只需fork一个读一个写就可以通信了。