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

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

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

       &nbsp;  1.全(quan)雙工(gong)的通(tong)信模式,數據先(xian)進先(xian)出;

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

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

使(shi)用FIFO的步(bu)驟(zou)如下:

一、創建/打(da)開一個(ge)FIFO

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

-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不是普(pu)通文(wen)件,所以只能用文(wen)件IO來訪問。

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

函數mkfifo用于創(chuang)建(jian)一(yi)個有名管(guan)道,參數path指定要創(chuang)建(jian)的FIFO的路徑,mode為該管(guan)道文件的訪問權限(xian),一(yi)般用八進(jin)制(zhi)數表(biao)示。

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

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

#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;
 &nbsp;      }

二、讀(du)/寫FIFO

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

#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);
        }
  &nbsp;  &nbsp;  ……

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

后(hou)總結一下(xia)在使用FIFO時(shi)要(yao)注意的問題(ti):

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

程對(dui)于打開的(de)FIFO來說就是(shi)一(yi)個讀端/寫(xie)端。如果指定的(de)是(shi)讀寫(xie)方(fang)式(shi),那么進程既是(shi)讀端又是(shi)寫(xie)端。

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

閉,程序要做相應的(de)處理(li)。

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

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

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

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)