我们知道每个进程都有自己的虚拟地址空间,其中包括了用户空间和内核空间,用户空间是进程可以访问的地址空间,内核空间就是操作系统内核独享的部分,所以任意进程共享内核空间。
此时,我们就可以借助内核开辟一块内存用于进程间的通信。
创建文件是mkdir filename 创建命名管道也是类似的 mkfifo filename
当然也可以用一个函数
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
pathname
:命名管道的路径名。mode
:指定创建的管道的访问权限,类似于chmod
函数中的权限设置。
返回值:
- 若成功,返回0。
- 若失败,返回-1,并设置
errno
错误码以指示错误类型
实操部分
一个fifo_w.c 用于写端
一个fifo_r.c 用于读端
几个问题 1.一个读一个写肯定没问题,一个写多个读呢?
2.一个读多个写呢?多个读多个写呢?
先给出实验结果,代码放下面
如下图,一个读,两个写,其实他读的顺序是不能保证两个线程写入的时机冲突问题
一个写,多个读
mmap实现方式:内存映射实现进程通信-CSDN博客
fifo_w.c
#include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> void sys_err(char *str){ perror(str); exit( -1); } int main(int argc,char *argv[]){ int fd,i; char buf[ 4096]; if (argc < 2) { printf( "Enter like this: ./a.out fifonane\n"); return -1; } fd = open(argv[1],O_WRONLY); if(fd< 0) sys_err( "open" ); i=0; while(1){ sprintf(buf,"hello pku %d\n",i++); write(fd,buf,strlen(buf)); sleep(1); } close(fd); return 0; }
fifo_r.c:
#include <sys/stat.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> void sys_err(char *str){ perror(str); exit( -1); } int main(int argc,char *argv[]){ int fd,len; char buf[4096]; if (argc < 2) { printf( "./a.out fifonane\n"); return -1; } fd = open(argv[1],O_RDONLY); if(fd< 0) sys_err( "open" ); while(1){ len=read(fd,buf,sizeof(buf)); write(STDOUT_FILENO,buf,len); sleep(1); } close(fd); return 0; }