標籤:span 結構 family 檔案 [1] 系統編程 types.h fcntl fprintf
處理序間通訊-fifo
處理序間通訊的還有一種方式是fifo。
fifo是還有一種管道:有名管道。從名字能夠看出。它也是隊列。
使用fifo通訊前,得先建立fifo
$ mkfifo myfifo
隨後僅僅需對myfifo像檔案一樣使用即可。
fifo_w.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/fcntl.h>struct stu{int id;char name[20];};int main(int argc, char **argv){if(argc != 2){fprintf(stderr, "usage:./app fifo\n");exit(1);}int fd;if((fd = open(argv[1], O_WRONLY)) < 0){fprintf(stderr, "open:can not open file:%s\n", argv[1]);exit(1);}struct stu zx = {0, "zhangxiang"};int id = 0;while(1){id++;zx.id = id;write(fd, &zx, sizeof(zx));sleep(1);}close(fd);return 0;}
fifo_r.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/fcntl.h>struct stu{int id;char name[20];};int main(int argc, char **argv){if(argc != 2){fprintf(stderr, "usage:./app fifo");exit(1);}int fd;if((fd = open(argv[1], O_RDONLY)) < 0){fprintf(stderr, "open:can not open file:%s", argv[1]);exit(1);}struct stu zx;while(1){read(fd, &zx, sizeof(zx));printf("id=%d,name=%s\n", zx.id, zx.name);sleep(1);}close(fd);return 0;}
測試
$ gcc fifo_w.c -o fifo_w$ gcc fifo_r.c -o fifo_r$ fifo_w myfifo//另開一終端$ fifo_r myfifoid=1,name=zhangxiangid=2,name=zhangxiangid=3,name=zhangxiangid=4,name=zhangxiangid=5,name=zhangxiangid=6,name=zhangxiangid=7,name=zhangxiangid=8,name=zhangxiang^c
以上示範範例中,一個進程不斷地向fifo中寫入結構體類型的資料。還有一個進程不斷地從fifo中讀出資料。從而達到進程間的通訊。
CCPP Blog 檔案夾
linux系統編程:處理序間通訊-fifo