文章目录
- 代码实现
- mkfifo函数
- open函数
代码实现
#include<fcntl.h> // open()
#include<sys/wait.h> // wait()
#include<sys/types.h> // mkfifo()
#include<sys/stat.h> // mkfifo()
#include<iostream>
#include<unistd.h> // fork()using namespace std;#define MAXLINE 80int main(){char buff[MAXLINE];if(mkfifo("fifo", 0664) == -1){cerr << "mififo: " << endl;exit(1);}pid_t pid = fork();if(pid < 0){cerr << "fork: " << endl;exit(1);}if(pid == 0){int read_fd = open("fifo", O_RDONLY);int len = read(read_fd, buff, MAXLINE);write(STDOUT_FILENO, buff, len);close(read_fd);exit(0);}else{int write_fd = open("fifo", O_WRONLY);write(write_fd, "cow a cow a!\n", 13);close(write_fd);wait(NULL);}
}
输出结果:
mkfifo函数
mkfifo
是一个建立命名管道的函数。
表头文件:
#include<sys/types.h>
#include<sys/stat.h>
定义函数:
int mkfifo(const char * pathname,mode_t mode);
依参数 `pathname `建立特殊的 `FIFO` 文件,该文件必须不存在。
参数mode为该文件的权限。
open函数
open
是 UNIX
系统(包括 LINUX、Mac
等)的系统调用函数,区别于C语言库函数 fopen
。以可写的方式 fopen
一个文件时,如果 文件不存在则会自动创建 ,而 open
一个文件时必须 明确 O_CREAT
才会创建文件 ,否则文件不存在就出错返回。
头文件:#include<fcntl.h>
定义函数:
int open(constchar*pathname,int flags);
int open(constchar*pathname,int flags,mode_t mode);
参数说明:
1.pathname —— 是待打开/创建文件的POSIX路径名(如/home/user/a.cpp)。
2.flags —— 于指定文件的打开/创建模式,这个参数可由以下一个或者多个常量(定义于fcntl.h)进行“或”运算,构成falgs。
3.mode —— 仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。
参数选项:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR: 读,写打开
这三个常量,必须指定一个且只能指定一个O_CREAT: 若文件不存在,则创建它,需要使用mode选项。来指明新文件的访问权限。O_APPEND: 追加写,如果文件已经有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。
返回值:成功:新打开的文件描述符。失败:-1。
open返回的文件描述符一定是最小的而且没有被使用的。