IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 有名管道的用法
有名管道的用法
時間:2016-12-29作者:華清遠見

有名管道又稱為FIFO,是進程間通信的一種方式。FIFO具有以下特點:

          1.全雙工的通信模式,數據先進先出;

          2.可以用于任意的進程之間,通過指定相同的管道文件進行通信;

          3.文件名存在文件系統中,而管道中的內容存在于內存中。可通過open、read、write對其操作;

使用FIFO的步驟如下:

一、創建/打開一個FIFO

FIFO是一種文件類型,在Linux系統中FIFO的類型用p表示。如下所示: 

-rwxr-xr-x 1 root root 7368 2008-10-29 09:05 create_fifo 
        -rw-r--r-- 1 root root 380 2008-10-29 09:05 create_fifo.c 
        prw-r--r-- 1 root root 0 2009-06-12 14:18 myfifo 
        -rwxr-xr-x 1 root root 8178 2008-10-29 08:58 read_fifo 
        -rw-r--r-- 1 root root 1185 2008-10-29 09:00 read_fifo.c 
        -rwxr-xr-x 1 root root 8333 2009-06-12 14:20 write_fifo 
        -rw-r--r-- 1 root root 1139 2009-06-12 14:19 write_fifo.c

可以看到,雖然FIFO文件存在于文件系統中(可供不同的進程打開),但FIFO中的內容都存放在內存中,所以文件大小始終為0。
由于FIFO不是普通文件,所以只能用文件IO來訪問。

#include <sys/stat.h> 
        int mkfifo(const char *path, mode_t mode);

函數mkfifo用于創建一個有名管道,參數path指定要創建的FIFO的路徑,mode為該管道文件的訪問權限,一般用八進制數表示。

#include <sys/stat.h> 
        #include <fcntl.h> 
        int open(const char *path, int oflag, ... );

函數open通過指定路徑打開一個文件,不同的進程可以調用open打開同一個FIFO進行通信。參考下面的代碼(相關頭文件省略)

#define BUF_SIZE 51 
        int main(int argc, char *argv[]) 
        { 
                  int fd;
                  ssize_t n;
                  char buf[BUF_SIZE];
                  if ( argc <2)
                  {
                           fprintf(stdout, “Usage: %s <fifo_path>\n”, argv[0]);
                           exit(1);
                  }
                  if ( mkfifo(argv[1], 0666) < 0 ) // 創建FIFO失敗
                  {
                           if (errno != EEXIST ) // 出錯原因不是因為管道已存在
                           {
                           fprintf(stderr, “mkfifo() failed %s\n”, strerror(errno));
                           exit(-1);
                           }
                  }
                  if ( (fd = open(argv[1], O_RDWR)) < 0 ) // 打開FIFO出錯
                  { // 注:< 優先級要高于 =
                           fprintf(stderr, “open() failed %s\n”, strerror(errno));
                           exit(-1);
                  }
                   …
                   return 0;
        }

二、讀/寫FIFO

進程打開FIFO后,就可以根據open時指定的選項對其進行相應的讀/寫操作(請參考open的幫助文檔中關于選項的說明)。

#include <unistd.h>
        ssize_t read(int fildes, void *buf, size_t nbyte);
        ssize_t write(int fildes, const void *buf, size_t nbyte);
        ……
        if ((n = read(fd, buf, BUF_SIZE)) < 0 )
        {
                    fprintf(stderr, “read() failed %s\n”, strerror(errno));
                    exit(-1);
        }
        else if ( n = = 0 )
        {
                    fprintf(stdout, “all write sides are closed…\n”); 
                    exit(-1);
        }
        else
        {
                    fprintf(stdout, “read %d bytes from FIFO : %s\n”, n, buf);
        }
        ……

對FIFO的寫操作,大家可以仿照上面的代碼。

后總結一下在使用FIFO時要注意的問題:

        1. 在用open打開FIFO時有可能會阻塞,原因就是當前只有讀端或寫端存在。換句話說,如果程序在打開FIFO時指定了只讀方式/只寫方式,那么該進

程對于打開的FIFO來說就是一個讀端/寫端。如果指定的是讀寫方式,那么進程既是讀端又是寫端。

        2. 從FIFO中讀數據時(用read函數),如果沒有數據,默認是阻塞等待,直到有數據被寫入FIFO。如果read函數返回0,說明該FIFO所有的寫端都已關

閉,程序要做相應的處理。

            向FIFO寫入數據時(使用write函數),如果FIFO有足夠空間,write函數會返回寫入的字節數;如果空間不夠,write函數會阻塞,直到寫完為止。當所

有的讀端都關閉時,再向FIFO寫數據會出錯。內核會向寫進程發管道斷裂的信號(SIGPIPE), 從而終止該進程。處理的辦法有兩種:程序以讀寫方式打開

FIFO或是在程序中捕捉SIGPIPE信號,由用戶自行處理。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 河北永生食品有限公司,益宁挂面, 香海园| 山西洗煤设备_山西洗煤机_山西离心机-山西东鑫昶机械科技股份有限公司 | 湖州搬家公司_档案搬迁_货物运输_钟点搬运价格「湖州蓝天家政综合服务有限公司」 | 微米环境-餐厨/厨余/果蔬垃圾处理设备厂家-大型成套设备解决方案 | 河北高新技术企业认定,沧州商标注册,沧州9001质量管理体系认证,沧州高新技术企业认定,沧州体系认证,沧州商标续展,沧州版权登记,河北国瑞企业管理咨询有限公司 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 温州方圆仪器有限公司 工业自动化|自动化设备 - 温州方圆仪器有限公司 | 陕西锐锋建筑安装有限公司,锐锋建筑,总承包,专业分包,市政综合,劳务,水电钢构,铁路公路,房建,房屋建筑施工 | 深圳专卖店设计,餐饮空间设计,酒店空间策划设计【左右高端人文空间设计公司】 | 聚氨酯碰头,聚氨酯托辊,聚氨酯地辊/地滚轮/地轮/托绳轮-济宁卓力聚氨酯制品有限公司 | 沈阳资质代办_代办建筑资质「快」-【华廷元】沈阳代办公司首页- 沈阳机电一体化电热锅炉_沈阳蓄热式电锅炉_沈阳壁挂式电锅炉【沈阳远鹏电热供水设备工程安装有限公司】 | 开关柜无线测温_电缆接头测温系统_六氟化硫sf6气体泄漏报警监测_卫星同步时钟-山东正瑞电子有限公司 | 桁架楼承板_钢筋桁架楼承板厂家-山东新材料科技 | 装盒机|全自动封盒机|纸盒子包装机|高速装盒机定制-温州胜泰机械有限公司 | 山东淄博海杰化工有限公司-淄博海杰化工_NP-10、OP-10、吐温80、司盘80、磺酸、油酸等乳化剂 | 胶球清洗-射水抽气器-磷酸盐加药装置-连云港振辉机械设备有限公司 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 企业旺旺-qy55.com| 圆锯机-滚牙机-滚丝轮-滚丝机-滚牙轮-切断机-东莞市溪远泰五金机械有限公司 | 木工圆锯片,进口锯片厂家,合金锯片生产厂家,木工合金锯片,BAK(百恪)刀具有限公司 | 专注欧美工业控制自动化设备-MRO工业品采购服务-科电远扬 | 秦皇岛图成玻璃_横切机,琴键落板,堆垛机械手,玻璃钢化设备,掰边机,铺纸机,水平堆垛机+超大板堆垛机,纵掰纵分,下片机,冷端优化切割 | 磨粉机_上海磨粉机_雷蒙磨粉机_超细磨粉机_磨粉机价格-上海山卓重工机械有限公司 | 深圳沃亚游学官网丨国外游学丨国际夏冬令营丨美国游学线路丨出国短期游学丨亲子海外游丨游学咨询: 0755-83843308 | 湖南长沙癫痫病医院_湖南癫痫病专科医院_湖南治疗癫痫病专业医院_长沙和谐医院有限公司 | 生物可降解膜_全降解薄膜_可降解包装膜材料厂家-凯峰降解膜 | 型煤锅炉进煤机|型煤链条炉排 |重型板链除渣机 |丹东刮板输送机|丹东脱硫除尘器-铧洋机械 | 内蒙古国际门窗幕墙展览会| 湖南九农王机电设备有限公司官网 | 深圳PCB电路板厂|PCB线路板厂|FPC柔性电路板厂|FPC软性线路板生产厂家|恒成和电路板:18681495413 | 日本国际高中学校招生【立学仕日本留学服务】日语中学学校|美术生|艺术生|高中生|本科|研究生|语言学校留学择校申请 | 今日标准_走心机_数控走心机_车铣复合_厂家_深圳今日标准官方网站 | 限矩型液力偶合器_调速型液力偶合器_摩擦型耦合器生产厂家-河南省华升矿机有限公司 | 湖北大洋塑胶有限公司|AGR|PPR|RTP|HDPE|e-PSP钢塑复合压力管道生产厂家 | 移动石料破碎机-颚式锤式反击式破碎机设备厂家_山东.青州富康机械 | 青岛除甲醛公司|青岛甲醛治理|青岛除甲醛|甲醛检测|光触媒除甲醛|装修除味除甲醛|新房除甲醛|青岛室内环境污染检测治理|青岛闪洁环保科技有限公司官网 | 无缝钢管生产厂家-20G-L360N无缝钢管价格-天津海诚无缝钢管集团 无尘投料站-真空上料机-旋振筛|超声波振动筛|摇摆筛|筛分机-新乡市欧霖佳机械有限公司 | 河北省农林科学院石家庄果树研究所 | 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 新一能-配电箱、变频柜、plc控制柜、开关柜生产厂家 | 金相切割机-金相磨抛机-显微/维氏/布氏/洛氏硬度计-自准直仪-金相显微镜-万能材料试验机-清洁度检测仪-淋雨试验机-上海中研精密仪器制造有限公司 |