久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久


有名管道(FIFO)

分享到:
           

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

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

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

 ;   對于(yu)讀(du)進(jin)程(cheng):

    ● 若(ruo)該管道是阻塞打開,且當前(qian)FIFO內(nei)沒有(you)(you)數(shu)據,則對讀進(jin)程而言將(jiang)一直阻塞到有(you)(you)數(shu)據寫(xie)入。

    ● 若該管道(dao)是(shi)非阻(zu)塞打開,則不論(lun)FIFO內(nei)是(shi)否(fou)有數(shu)(shu)據,讀(du)進程(cheng)都會立(li)(li)即執行讀(du)操作。即如(ru)果FIFO內(nei)沒有數(shu)(shu)據,則讀(du)函數(shu)(shu)將立(li)(li)刻返回0。

    對于寫進程:

    ● ;若(ruo)該管道(dao)是阻塞(sai)打(da)開,則寫(xie)操(cao)作將一直阻塞(sai)到數(shu)據可以被寫(xie)入。

    ● 若(ruo)該管道是非(fei)阻(zu)塞(sai)打開(kai)而不能寫(xie)入(ru)全部數(shu)據,則讀(du)操作進行部分寫(xie)入(ru)或(huo)者調用失敗(bai)。

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

表(biao)1 mkfifo()函數語法(fa)要點(dian)

所需頭文件 #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

&nbsp;   表2再對FIFO相關的出錯(cuo)信息進行歸納,以方便(bian)用戶查錯(cuo)。

表(biao)2 FIFO相關的出錯信息

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

    下(xia)面的(de)實(shi)例(li)包(bao)含兩(liang)個(ge)程(cheng)(cheng)序(xu),一個(ge)用(yong)于讀(du)管(guan)(guan)道(dao),另一個(ge)用(yong)于寫管(guan)(guan)道(dao)。其(qi)中(zhong)在讀(du)管(guan)(guan)道(dao)的(de)程(cheng)(cheng)序(xu)中(zhong)創建管(guan)(guan)道(dao),并且作(zuo)為(wei)main()函數里(li)的(de)參數由用(yong)戶輸入(ru)要寫入(ru)的(de)內(nei)容;讀(du)管(guan)(guan)道(dao)的(de)程(cheng)(cheng)序(xu)會讀(du)出用(yong)戶寫入(ru)到管(guan)(guan)道(dao)的(de)內(nei)容。這兩(liang)個(ge)程(cheng)(cheng)序(xu)采用(yong)的(de)是阻塞式讀(du)寫管(guan)(guan)道(dao)模式。

    寫管道的程序如(ru)下(xia):

    /* 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);
    }

    讀管道(dao)程序如(ru)下:

    /* 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);
    }

    為了能夠較好地觀(guan)察運(yun)行(xing)結(jie)果(guo)(guo),需要把這兩個(ge)程序(xu)分別在兩個(ge)終端里運(yun)行(xing),在這里首先(xian)啟動讀管(guan)(guan)(guan)道(dao)(dao)(dao)程序(xu)。讀管(guan)(guan)(guan)道(dao)(dao)(dao)進(jin)程在建立管(guan)(guan)(guan)道(dao)(dao)(dao)后就開始循環地從管(guan)(guan)(guan)道(dao)(dao)(dao)里讀出內容,如(ru)(ru)果(guo)(guo)沒有數據可(ke)讀,則一直阻塞(sai)到(dao)寫(xie)管(guan)(guan)(guan)道(dao)(dao)(dao)進(jin)程向管(guan)(guan)(guan)道(dao)(dao)(dao)寫(xie)入數據。在啟動了寫(xie)管(guan)(guan)(guan)道(dao)(dao)(dao)程序(xu)后,讀進(jin)程能夠從管(guan)(guan)(guan)道(dao)(dao)(dao)里讀出用(yong)戶(hu)的輸(shu)入內容,程序(xu)運(yun)行(xing)結(jie)果(guo)(guo)如(ru)(ru)下。

    終端一:

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

    終端二(er):

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

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

   熱點鏈(lian)接:

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

更多新聞>>