文章目錄
- 代碼實現
- 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返回的文件描述符一定是最小的而且沒有被使用的。