有名管道
1、查看命令:man 3 mkfifo
2、頭文件:#include <sys/types.h>
#include <sys/stat.h>
3、函數原型:int mkfifo(const char *pathname, mode_t mode);
a、*pathname:有名管道的名字 例如:/home/gec/myfifo
b、 mode:八進制的權限, 例如:0777
4、返回值:
成功:0
失敗-1
5、函數特點:
有名管道存在於文件系統中,提供寫入原子性特征,共享內存效率高
6、有名管道的特征:
a、有名字,儲存於普通文件系統中
b、任何具有相應權限的進程都可以使用open()來獲取FIFO的文件描述符
c、跟普通文件一樣,用read()和writ()來讀和寫
d、不能用lseek來定位
e、具有寫入原子性,支持多寫者同時進行寫操作而數據不會相互踐踏
(1)讀取數據的代碼:fifo_read.c #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<string.h> #include<fcntl.h> #include<stdlib.h> #include<errno.h>
#define FIFO "/home/gec/FIFO" /*有名管道的名字*/
#define LENGTH 50 /*字符數組的長度*/
int main(int argc,char **argv) { int ret,fd; /*ret用來接收mkfifo返回的值,fd用來存放打開有名管道的文件描述符*/
char buf[LENGTH]; if(access(FIFO,F_OK))/*判斷是否已經創建了有名管道,如果已經創建,則返回0否則返回非0的數*/ { ret = mkfifo(FIFO,0777); /*創建有名管道,成功返回0,失敗返回-1*/
if(ret == -1) /*創建有名管道失敗*/ { perror("mkfifo"); exit(1); } } fd = open(FIFO,O_RDONLY); /*已讀方式打開有名管道,不能同時以讀寫權限打開,成功返回文件 描述符,失敗返回-1*/
if(fd == -1) /*打開失敗*/ { perror("open"); exit(1); } puts("從有名管道中讀取到的數據:"); while(1) { memset(buf,0,sizeof(buf)); /*清空緩沖區*/ read(fd,buf,sizeof(buf)); /*阻塞讀取有名管道中的數據到buf中*/ printf("%s",buf); if(strncmp(buf,"q",1) == 0) /*buf中的數據和q比較,如果相等,則返回0*/ { break; } } close(fd); /*關閉有名管道*/
return 0; }
(2)寫入數據的代碼:fifo_write.c #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<string.h> #include<fcntl.h> #include<stdlib.h> #include<errno.h>
#define FIFO "/home/gec/FIFO" /*有名管道的名字*/
#define LENGTH 50 /*字符數組的長度*/
int main(int argc,char **argv) { int ret,fd; /*ret用來接收mkfifo返回的值,fd用來存放打開有名管道的文件描述符*/
char buf[LENGTH]; if(access(FIFO,F_OK))/*判斷是否已經創建了有名管道,如果已經創建,則返回0 否則返回非0的數*/ { ret = mkfifo(FIFO,0777); /*創建有名管道,成功返回0,失敗返回-1*/
if(ret == -1) /*創建有名管道失敗*/ { perror("mkfifo"); exit(1); } } fd = open(FIFO,O_WRONLY); /*以寫方式打開有名管道,不能同時以讀寫權限打開,成功返回文件 描述符,失敗返回-1*/
if(fd == -1) /*打開失敗*/ { perror("open"); exit(1); } puts("請輸入數據到有名管道中,輸入q退出:"); while(1) { memset(buf,0,sizeof(buf)); /*清空緩沖區*/ fgets(buf,sizeof(buf),stdin); /*從終端輸入數據到buf中*/ write(fd,buf,strlen(buf)); /*阻塞把數據寫入有名管道*/
if(strncmp(buf,"q",1) == 0) /*buf中的數據和q比較,如果相等,則返回0*/ { printf("aaaa\n"); break; } } close(fd); /*關閉有名管道*/
return 0; }