色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区


有名管道(FIFO)

分享到:
           

    本文關(guān)鍵字: linux 管道通信,linux 進(jìn)程通信方式,有名管道,F(xiàn)IFO

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

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

    對于讀進(jìn)程:

    ● 若該管道是阻塞打開,且當(dāng)前FIFO內(nèi)沒有數(shù)據(jù),則對讀進(jìn)程而言將一直阻塞到有數(shù)據(jù)寫入。

    ● 若該管道是非阻塞打開,則不論FIFO內(nèi)是否有數(shù)據(jù),讀進(jìn)程都會立即執(zhí)行讀操作。即如果FIFO內(nèi)沒有數(shù)據(jù),則讀函數(shù)將立刻返回0。

    對于寫進(jìn)程:

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

    ● 若該管道是非阻塞打開而不能寫入全部數(shù)據(jù),則讀操作進(jìn)行部分寫入或者調(diào)用失敗。

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

表1 mkfifo()函數(shù)語法要點

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

    表2再對FIFO相關(guān)的出錯信息進(jìn)行歸納,以方便用戶查錯。

表2 FIFO相關(guān)的出錯信息

EACCESS 參數(shù)filename所指定的目錄路徑無可執(zhí)行的權(quán)限
EEXIST 參數(shù)filename所指定的文件已存在
ENAMETOOLONG 參數(shù)filename的路徑名稱太長
ENOENT 參數(shù)filename包含的目錄不存在
ENOSPC 文件系統(tǒng)的剩余空間不足
ENOTDIR 參數(shù)filename路徑中的目錄存在但卻非真正的目錄
EROFS 參數(shù)filename指定的文件存在于只讀文件系統(tǒng)內(nèi)

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

    寫管道的程序如下:

    /* 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[]) /* 參數(shù)為即將寫入的字符串 */
    {
        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;

        /* 判斷有名管道是否已存在,若尚未創(chuàng)建,則以相應(yīng)的權(quán)限創(chuàng)建 */
        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);
    }

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

    終端一:

    $ ./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
    …

    本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》

   熱點鏈接:

   1、標(biāo)準(zhǔn)流管道
   2、無名管道系統(tǒng)調(diào)用
   3、Linux下進(jìn)程間通信方式-管道
   4、Linux下進(jìn)程間通信
   5、實驗:編寫守護(hù)進(jìn)程

更多新聞>> 

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 欧美精品videosex极品1| 欧美人与性动交a欧美精品| 国产在线播放91| 国产成人小视频在线观看| 91干在线观看| 全球成人中文在线| 国产精品人人做人人爽| 92国产精品视频| 亚洲女人天堂色在线7777| 在线亚洲国产精品网| 久久九九免费视频| 欧美激情xxxxx| 国产成人福利夜色影视| 成人伊人精品色xxxx视频| 日韩电影第一页| 日韩在线观看免费全集电视剧网站| 日日狠狠久久偷偷四色综合免费| 麻豆国产va免费精品高清在线| 欧美电影在线观看网站| 欧美在线影院在线视频| 成人亲热视频网站| 国产一区二区日韩精品欧美精品| 久久视频在线直播| 欧美亚洲在线视频| 亚洲一区二区中文| 日韩亚洲第一页| 久久免费精品日本久久中文字幕| 国产精品久久久久国产a级| 精品在线欧美视频| 岛国视频午夜一区免费在线观看| 欧美有码在线视频| 亚洲黄一区二区| 动漫精品一区二区| 成人免费大片黄在线播放| 亚洲图片制服诱惑| 午夜美女久久久久爽久久| 91久久综合亚洲鲁鲁五月天| 久久精品国产2020观看福利| 欧美亚洲成人网| 亚洲色图第一页| 久久免费精品日本久久中文字幕|