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


有名管道(FIFO)

分享到:
           

    本文關鍵字: linux 管道通信,linux 進程通信方式,有名管道,FIFO

    有名管道的創建可以使用函數mkfifo(),該函數類似于文件中的open()操作,可以指定管道的路徑和打開的模式。用戶還可以在命令行使用“mknod 管道名 p”來創建有名管道。

    在創建管道成功后,就可以使用open()、read()和write()這些函數了。與普通文件的開發設置一樣,對于為讀而打開的管道可在open()中設置O_RDONLY,對于為寫而打開的管道可在open()中設置O_WRONLY,在這里與普通文件不同的是阻塞問題。由于普通文件在讀寫時不會出現阻塞問題,而在管道的讀寫中卻有阻塞的可能,這里的非阻塞標志可以在open()函數中設定為O_NONBLOCK。下面分別對阻塞打開和非阻塞打開的讀寫進行討論。

    對于讀進程:

    ● 若該管道是阻塞打開,且當前FIFO內沒有數據,則對讀進程而言將一直阻塞到有數據寫入。

    ● 若該管道是非阻塞打開,則不論FIFO內是否有數據,讀進程都會立即執行讀操作。即如果FIFO內沒有數據,則讀函數將立刻返回0。

    對于寫進程:

    ● 若該管道是阻塞打開,則寫操作將一直阻塞到數據可以被寫入。

    ● 若該管道是非阻塞打開而不能寫入全部數據,則讀操作進行部分寫入或者調用失敗。

    表1列出了mkfifo()函數的語法要點。

表1 mkfifo()函數語法要點

所需頭文件 #include <sys/types.h> #include <sys/state.h>
函數原型 int mkfifo(const char *filename,mode_t mode)
函數傳入值 filename:要創建的管道
mode O_RDONLY:讀管道
O_WRONLY:寫管道
O_RDWR:讀寫管道
O_NONBLOCK:非阻塞
O_CREAT:如果該文件不存在,那么就創建一個新的文件,并用第3個參數為其設置權限
O_EXCL:如果使用O_CREAT時文件存在,那么可返回錯誤消息。這個參數可測試文件是否存在
函數返回值 成功:0
出錯:-1

    表2再對FIFO相關的出錯信息進行歸納,以方便用戶查錯。

表2 FIFO相關的出錯信息

EACCESS 參數filename所指定的目錄路徑無可執行的權限
EEXIST 參數filename所指定的文件已存在
ENAMETOOLONG 參數filename的路徑名稱太長
ENOENT 參數filename包含的目錄不存在
ENOSPC 文件系統的剩余空間不足
ENOTDIR 參數filename路徑中的目錄存在但卻非真正的目錄
EROFS 參數filename指定的文件存在于只讀文件系統內

    下面的實例包含兩個程序,一個用于讀管道,另一個用于寫管道。其中在讀管道的程序中創建管道,并且作為main()函數里的參數由用戶輸入要寫入的內容;讀管道的程序會讀出用戶寫入到管道的內容。這兩個程序采用的是阻塞式讀寫管道模式。

    寫管道的程序如下:

    /* fifo_write.c */
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #define MYFIFO "/tmp/myfifo" /* 有名管道文件名 */
    #define MAX_BUFFER_SIZE PIPE_BUF /* 定義在limits.h中 */

    int main(int argc, char * argv[]) /* 參數為即將寫入的字符串 */
    {
        int fd;
        char buff[MAX_BUFFER_SIZE];
        int nwrite;

        if(argc <= 1)
        {
            printf("Usage: ./fifo_write string\n");
            exit(1);
        }
        sscanf(argv[1], "%s", buff);

        /* 以只寫阻塞方式打開FIFO管道 */
        fd = open(MYFIFO, O_WRONLY);
        if (fd == -1)
        {
            printf("Open fifo file error\n");
            exit(1);
        }

        /* 向管道中寫入字符串 */
        if ((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0)
        {
            printf("Write '%s' to FIFO\n", buff);
        }
        close(fd);
        exit(0);
    }

    讀管道程序如下:

    /* fifo_read.c */
    (頭文件和宏定義同fifo_write.c)
    int main()
    {
        char buff[MAX_BUFFER_SIZE];
        int fd;
        int nread;

        /* 判斷有名管道是否已存在,若尚未創建,則以相應的權限創建 */
        if (access(MYFIFO, F_OK) == -1)
        {
            if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST))
                {
                    printf("Cannot create fifo file\n");
                    exit(1);
                }
            }
            /* 以只讀阻塞方式打開有名管道 */
            fd = open(MYFIFO, O_RDONLY);
            if (fd == -1)
            {
                printf("Open fifo file error\n");
                exit(1);
            }

            while (1)
            {
                memset(buff, 0, sizeof(buff));
                if ((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0)
            {
                printf("Read '%s' from FIFO\n", buff);
            }
        }
        close(fd);
        exit(0);
    }

    為了能夠較好地觀察運行結果,需要把這兩個程序分別在兩個終端里運行,在這里首先啟動讀管道程序。讀管道進程在建立管道后就開始循環地從管道里讀出內容,如果沒有數據可讀,則一直阻塞到寫管道進程向管道寫入數據。在啟動了寫管道程序后,讀進程能夠從管道里讀出用戶的輸入內容,程序運行結果如下。

    終端一:

    $ ./fifo_read
    Read 'FIFO' from FIFO
    Read 'Test' from FIFO
    Read 'Program' from FIFO
    …

    終端二:

    $ ./fifo_write FIFO
    Write 'FIFO' to FIFO
    $ ./fifo_write Test
    Write 'Test' to FIFO
    $ ./fifo_write Program
    Write 'Program' to FIFO
    …

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點鏈接:

   1、標準流管道
   2、無名管道系統調用
   3、Linux下進程間通信方式-管道
   4、Linux下進程間通信
   5、實驗:編寫守護進程

更多新聞>> 

主站蜘蛛池模板: 箱式污泥采样器-全自动旋转振荡器-恒温石墨电热板-常州亿通分析仪器制造有限公司 | 金属剪切机,金属打包机,废钢剪切机,废铁压块机,金属压块机,废纸打包机,重废龙门剪,废钢龙门剪,箱式剪,液压剪切机-瑞顿机械装备制造江阴有限公司 | 中国焊接协会网站—中国焊接信息网;焊接行业最权威访问量最大的专业网站:焊接信息、焊接材料,焊接机器,焊接设备,焊机,焊材,辅助设备,焊机配件,仪器仪表,电动工具,钎焊,送丝机,表面处理,自动化专机,焊锡丝,助焊剂 | 上海增晨贸易有限公司-PC端 | 郑州天恩石油机械有限公司| 西克制冷官网│制冷机组冷风机冷库设备厂家-西克制冷(无锡)有限公司_西克制冷(无锡)有限公司 | 喷涂机器人|自动喷涂生产线|自动喷涂设备|自动化生产线-深圳市荣德机器人科技有限公司 | 全彩LED显示屏厂家_室内户外电子屏-深圳华邦瀛光电有限公司 | 石墨热场|PECVD石墨舟|碳碳框|燃料电池双极板|半导体石墨|光纤用石墨模具|石墨电极加工|石墨制品|上海弘竣新能源材料有限公司 | 郑州天恩石油机械有限公司| 硝酸铵钙|山西硝酸钙|硝酸钾|太原硝酸钙镁|硝酸钾钙|亚硝酸钠-山西玉彤化工有限公司 | 儒亚科技_磁悬浮天平,竞争吸附,高压热重,重量法高压,高压密度 | 商易网-b2b电子商务平台网站大全免费B2B发布供求信息网站 | 环球医网 | 带来健康生活... | 中式婚礼_汉服婚礼_传统婚礼_婚庆公司_云歌婚礼策划【官网】 | 合肥固化地坪-安徽耐磨地坪-合肥环氧地坪厂家-安徽玉平地坪工程有限公司 | 易居房产律师网|北京房产律师|房产纠纷律师|房产律师 | 景德镇薪如陶瓷有限公司| 石英砂|无烟煤滤料|火山岩|聚合硫酸铁|活性炭-河南碧水清源水处理材料有限公司 | 山东金起起重机械有限公司[官网]-金桥银路悬臂吊,金起龙门吊,山东金起起重行吊,单梁起重机 | 聚丙烯酰胺,聚合氯化铝,重金属捕捉剂,污泥调理剂,活性氧化铝,生石灰,反渗透阻垢剂,工业葡萄糖,硫酸铝,果壳活性炭,柱状活性炭,蜂窝活性炭,石英砂,锰砂-北京雁归来环保科技有限公司-以真诚为立足之本,以质量为生存之本,愿与海内外同仁共创双赢。雁归来人一路走来,气贯长虹,勇锐盖过怯弱,进取压倒苟安!我们紧扣时代脉搏,专注水处理、继往开来! | 重庆木门_重庆木门十大品牌_重庆套装门_重庆烤漆门_重庆套装门十大品牌_重庆木门一线品牌_重庆川田木门 | 合肥发斯特精密塑模有限公司专业精密磨具,注塑模具,精密注塑机械零件(加工制造|生产|销售|厂家) 浩通集团 国际货运 物贸一体化 中非经贸 | 铁行火车票_铁行火车票网上订票_铁行火车票客户端【铁行官网】 | 潍坊亿宏重工机械有限公司,破碎机,高性能立磨机,颚式破碎机,锤式破碎机反击式破碎机,重锤式破碎机,高性能反击式破碎机,圆锥式破碎机,给料机系列,链板给料机系列,简易给料机系列,振动给料机 | 酸碱废气中和塔-酸雾废气吸收塔-酸雾废气处理塔|首页-广州市佰镀通风设备有限公司 | 苏州洁仪净化科技有限公司| 太原重卡叔叔运输有限公司-山西太原大件运输、太原物流公司、太原货运物流、太原大件运输、太原货运信息、长治物流公司、长治大件运输、晋城物流公司、晋城大件运输、忻州大件运输、朔州大件运输、阳泉大件运输、大同大件运输、吕梁大件运输、临汾大件运输、运城大件运城 | 七评-爱美儿信息科技有限公司〖官网〗? | 无土栽培|无土栽培技术|水肥一体化|无土栽培蔬菜 | 呼吸家官网|肺功能检测仪生产厂家|国产肺功能仪知名品牌|肺功能检测仪|肺功能测试仪|婴幼儿肺功能仪|弥散残气肺功能仪|肺功能测试系统|广州红象医疗科技有限公司|便携式肺功能仪|大肺功能仪|呼吸康复一体机|儿童肺功能仪|肺活量计|医用简易肺功能仪|呼吸康复系统|肺功能仪|弥散肺功能仪(大肺)|便携式肺功能检测仪|肺康复|呼吸肌力测定肺功能仪|肺功能测定仪|呼吸神经肌肉刺激仪|便携式肺功能 | 小耳朵电源_安防监控电源|小耳朵官网|电源适配器|摄像机电源|开关电源|小耳朵监控电源 | 社会百态,七仙女思春完整版免费高清电影引发的思考 | 惠声电子、广州市惠声电子科技有限公司、VBS、VBS惠声电子、VBS公共广播生产厂家、VBS广播功放生产厂家、VBS会议系统设备批发、VBSIP网络对讲系统厂家、VBS会议系统厂家、VBS智能中控厂家、VBS专业扩声厂家 | 铝基板_铜基板_铝基板厂家诚之益电路—汽车灯铜基板行业制商 | 无锡亮鑫不锈钢有限公司-不锈钢炉胆,马弗炉胆,耐高温炉胆,310s炉胆,网带炉 | 筱晓(上海)光子技术有限公司官网,MCT探测器,半导体激光二极管,中红外QCL激光器,光纤放大器,光电探测器 | 水阻柜-液阻柜-高压开关柜-高压固态软启动柜-磁控软启动柜-电解粉-无功补偿柜-配电柜-襄阳源创电气 | 郑州润滑油展-第16届中国润滑油、脂及汽车养护展览会-2025年5月27-28日-郑州国际会展中心 | 面馆加盟_重庆小面加盟_特色面馆加盟首选老城街 | 磐石在线-磐石市综合信息门户网www.pszx.com - Powered by Discuz! |