我们知道每个进程都有自己的虚拟地址空间,其中包括了用户空间和内核空间,用户空间是进程可以访问的地址空间,内核空间就是操作系统内核独享的部分,所以任意进程共享内核空间。
此时,我们就可以借助内核开辟一块内存用于进程间的通信。
创建文件是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.一个读多个写呢?多个读多个写呢?
先给出实验结果,代码放下面
如下图,一个读,两个写,其实他读的顺序是不能保证两个线程写入的时机冲突问题
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;
}