linux進程間通信——命名管道
FIFO(命名管道)不同于匿名管道之處在于它提供?個路徑名與之關(guān)聯(lián),以FIFO的?件形式存儲于?件系統(tǒng)中。命名管道是?個設(shè)備?件,因此,即使進程與創(chuàng)建FIFO的進程不存在親緣關(guān)系,只要可以訪問該路徑,就能夠通過FIFO相互通信。值得注意的是,F(xiàn)IFO(first input first output)總是按照先進先出的原則?作,第?個被寫?的數(shù)據(jù)將?先從管道中讀出。
創(chuàng)建命名管道的系統(tǒng)函數(shù)有兩個:mknod和mkfifo。兩個函數(shù)均定義在頭?件sys/stat.h,函數(shù)原型如下:
#include <sys/types.h> #include <sys/stat.h> int mknod(const char *path,mode_t mod,dev_t dev); int mkfifo(const char *path,mode_t mode);
函數(shù)mknod參數(shù)中path為創(chuàng)建的命名管道的全路徑名:mod為創(chuàng)建的命名管道的模式,指明其存取權(quán)限;dev為設(shè)備值,該值取決于?件創(chuàng)建的種類,它只在創(chuàng)建設(shè)備?件時才會?到。這兩個函數(shù)調(diào)?成功都返回0,失敗都返回-1。下?使?mknod函數(shù)創(chuàng)建了?個命名管道:
umask(0);if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1){perror("mkfifo error");exit(1);}
函數(shù)mkfifo前兩個參數(shù)的含義和mknod相同。下?是使?mkfifo的?例代碼:
umask(0);if (mkfifo("/tmp/fifo",S_IFIFO|0666) == -1){perror("mkfifo error!");exit(1);}
下面為一個試例:
read端
#include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #define PATH "./fifo" #define SIZE 128 int main() { umask(0); if (mkfifo (PATH,0666|S_IFIFO) == -1) { perror ("mkefifo error"); exit(0); } int fd = open (PATH,O_RDONLY); if (fd<0) { printf("open fd is error/n"); return 0; } char Buf[SIZE]; while(1){ ssize_t s = read(fd,Buf,sizeof(Buf)); if (s<0) { perror("read error"); exit(1); } else if (s == 0) { printf("client quit! i shoud quit!/n"); break; } else { Buf[s] = '/0'; printf("client# %s ",Buf); fflush(stdout); } } close (fd); return 3; }
下面為weite端:
#include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<string.h> #include<errno.h> #include<fcntl.h> #define PATH "./fifo" #define SIZE 128 int main() { int fd = open(PATH,O_WRONLY); if (fd < 0) { perror("open error"); exit(0); } char Buf[SIZE]; while(1) { printf("please Enter#:"); fflush(stdout); ssize_t s = read(0,Buf,sizeof(Buf)); if (s<0) { perror("read is failed"); exit(1); } else if(s==0) { printf("read is closed!"); return 1; } else{ Buf[s]= '/0'; write(fd,Buf,strlen(Buf)); } } return 0; }
打開兩個終端:
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選