1.管道,pipe()函数 实现最简单,实际为内核缓冲区的环形队列。 用于父子、兄弟等有血缘关系的进程间通信。 单向流动性,只能从管道读端读取,写端写入。 int fds[2]; pipe(fds);//传出参数,fd[0]为读端描述符,类似于stdin;fd[1]为写端描述符,类似于stdout 2.命名管道,fifo()函数 Linux基础文件类型。 可用于无血缘关系的进程间通信。 可多个读端,多个写端。 mkfifo("test", 0777);//创建一个命名管道 int fd1 = open("test", O_WRONLY);write(fd1, buf, strlen(buf));//一个进程写入 int fd2 = open("test", O_RDONLY)read(fd2, buf, sizeof(buf));//另一个进程读取 3.文件,open()函数 fork创建的子进程,共享文件描述符。 多个进程打开同一文件 4.共享存储映射,mmap()函数 借助文件创建映射内存。 进程间无血缘关系要求 void *mmap(void *addr, size_t len, int prot, int flags,int fd, off_t offset); addr:映射区首地址,传NULL,内核自动分配 len:映射区大小 prot:映射区读写权限,可选PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITE flags:标志位,MAP_SHARED表示同步到文件,MAP_PRIVATE不同步到文件,MAP_ANONYMOUS/MAP_ANON匿名映射区 fd:文件描述符 offset:偏移量,从文件的开始偏移量多少开始映射。offset大小必须是4K整数倍 int munmap(void *addr, size_t len);//释放映射区 addr:映射区首地址,所以不能对映射区首地址进行++或者--操作 len:映射区大小 注意点: 映射区创建完后文件可以立即关闭。 用于创建映射区的文件大小不能为0。 映射区创建过程含有对文件的读操作,所以文件起码得有读权限吧。 偏移量offset必须是4K的整数倍,因为Linux页大小是4K munmap的地址必须是mmap返回的地址,不能映射区地址进行++或者--操作 linux下创建匿名映射区使用MAP_SHARED、MAP_ANONYMOUS或者MAP_ANON参数和fd=-1即可,Unix下需要使用fd=open("/dev/zero",O_RDWR)。
5.信号量,signal()函数 开销最小 6.本地套接字,socket()函数 稳定性最好