基礎知識:html
有名管道,FIFO先進先出,它是一個單向(半雙工)的數據流,不一樣於管道的是:是最初的Unix IPC形式,可追溯到1973年的Unix第3版。使用其應注意兩點:函數
1)有一個與路徑名關聯的名字;學習
2)容許無親緣關係的進程通訊;測試
3)讀寫操做用read和write函數;ui
4)有open打開有名管道時,必須只能是隻讀或只寫spa
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 參數:pathname是一個普通的Unix路徑名,爲FIFO的名字;mode用於給一個FIFO指定權限位 返回:若成功返回0,不然返回-1 #include <unistd.h> ssize_t read(int fildes, void *buf, size_t nbyte); ssize_t write(int fildes, const void *buf, size_t nbyte); 含義:以上同個函數用來存取有名管道中的數據 #include <fcntl.h> int open(const char *path, int oflag, ... ); 含義:若是已存在一個有名管道,能夠用它打開 #include <unistd.h> int close(int fildes); 含義:關閉有名管道 #include <unistd.h> int unlink(const char *path); 含義:移除有名管道
測試代碼:線程
1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "unistd.h" 4 #include "sys/types.h" 5 #include "sys/stat.h" 6 #include "fcntl.h" 7 #include "string.h" 8 #define MAXLINE 256 9 int main(void) 10 { 11 int rfd, wfd; 12 pid_t pid; 13 char line[MAXLINE]; 14 15 if (mkfifo("./fifo1", 0666) < 0) 16 { 17 printf("mkfifo error"); 18 } 19 20 if ((pid = fork()) < 0) 21 { 22 printf("fork error"); 23 } 24 else if (pid > 0) 25 { 26 /* parent */ 27 if((wfd = open("./fifo1", O_WRONLY)) > 0 ) 28 { 29 write(wfd, "hello\n", 13); 30 close(wfd); 31 } 32 } 33 else 34 { /* child */ 35 if((rfd = open("./fifo1", O_RDONLY)) > 0 ) 36 { 37 int n = read(rfd, line, MAXLINE); 38 printf("%s", line); 39 close(rfd); 40 } 41 } 42 }
參考資料:code