gogo专业大尺度亚洲高清人体,美女张开双腿让男生桶,亚洲av无码一区二区三区鸳鸯影院,久久久久国产精品人妻

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > linux進(jìn)程間通信-FIFO,讓你全方位理解

linux進(jìn)程間通信-FIFO,讓你全方位理解 時(shí)間:2018-06-20      來源:未知

有名管道(FIFO)

有名管道也被稱為FIFO文件,是一種特殊的文件。由于linux所有的事物都可以被視為文件,所以對(duì)有名管道的使用也就變得與文件操作非常統(tǒng)一。

(1)創(chuàng)建有名管道

用如下兩個(gè)函數(shù)中的其中一個(gè),可以創(chuàng)建有名管道。

#include

#include

int mkfifo(const char *filename, mode_t mode);

filname是指文件名,而mode是指定文件的讀寫權(quán)限。

(2)打開有名管道

和打開其他文件一樣,可以用open來打開。通常有四種方法:

open(const char *path, O_RDONLY);

open(const char *path, O_RDONLY | O_NONBLOCK);

open(const char *path, O_WRONLY);

open(const char *path, O_WRONLY | O_NONBLOCK);

有三點(diǎn)要注意:

1就是程序不能以O(shè)_RDWR(讀寫)模式打開FIFO文件進(jìn)行讀寫操作,而其行為也未明確定義,因?yàn)槿缫粋(gè)管道以讀/寫方式打開,進(jìn)程就會(huì)讀回自己的輸出,同時(shí)我們通常使用FIFO只是為了單向的數(shù)據(jù)傳遞。

2就是傳遞給open調(diào)用的是FIFO的路徑名,而不是正常的文件。(如:

const char *fifo_name = "/tmp/my_fifo";)

3第二個(gè)參數(shù)中的選項(xiàng)O_NONBLOCK,選項(xiàng)O_NONBLOCK表示非阻塞,加上這個(gè)選項(xiàng)后,表示open調(diào)用是非阻塞的,如果沒有這個(gè)選項(xiàng),則表示open調(diào)用是阻塞的。

(3)阻塞問題

對(duì)于以只讀方式(O_RDONLY)打開的FIFO文件,如果open調(diào)用是阻塞的(即第二個(gè)參數(shù)為O_RDONLY),除非有一個(gè)進(jìn)程以寫方式打開同一個(gè)FIFO,否則它不會(huì)返回;如果open調(diào)用是非阻塞的的(即第二個(gè)參數(shù)為O_RDONLY | O_NONBLOCK),則即使沒有其他進(jìn)程以寫方式打開同一個(gè)FIFO文件,open調(diào)用將成功并立即返回。

對(duì)于以只寫方式(O_WRONLY)打開的FIFO文件,如果open調(diào)用是阻塞的(即第二個(gè)參數(shù)為O_WRONLY),open調(diào)用將被阻塞,直到有一個(gè)進(jìn)程以只讀方式打開同一個(gè)FIFO文件為止;如果open調(diào)用是非阻塞的(即第二個(gè)參數(shù)為O_WRONLY | O_NONBLOCK),open總會(huì)立即返回,但如果沒有其他進(jìn)程以只讀方式打開同一個(gè)FIFO文件,open調(diào)用將返回-1,并且FIFO也不會(huì)被打開。

(4)使用FIFO實(shí)現(xiàn)進(jìn)程間的通信

管道的寫入端從一個(gè)文件讀出數(shù)據(jù),然后寫入寫管道。管道的讀取端從管道讀出后寫到文件中。

寫入端代碼:fifowrite.c

#include

#include

#include

#include

#include

#include

#include

#include

int main()

{

const char *fifo_name = "/tmp/my_fifo";

int pipe_fd = -1;

int data_fd = -1;

int res = 0;

const int open_mode = O_WRONLY;

int bytes_sent = 0;

char buffer[PIPE_BUF + 1];

int bytes_read = 0;

if(access(fifo_name, F_OK) == -1)

{

printf ("Create the fifo pipe.\n");

res = mkfifo(fifo_name, 0777);

if(res != 0)

{

fprintf(stderr, "Could not create fifo %s\n", fifo_name);

exit(EXIT_FAILURE);

}

}

printf("Process %d opening FIFO O_WRONLY\n", getpid());

pipe_fd = open(fifo_name, open_mode);

printf("Process %d result %d\n", getpid(), pipe_fd);

if(pipe_fd != -1)

{

bytes_read = 0;

data_fd = open("Data.txt", O_RDONLY);

if (data_fd == -1)

{

close(pipe_fd);

fprintf (stderr, "Open file[Data.txt] failed\n");

return -1;

}

bytes_read = read(data_fd, buffer, PIPE_BUF);

buffer[bytes_read] = '\0';

while(bytes_read > 0)

{

res = write(pipe_fd, buffer, bytes_read);

if(res == -1)

{

fprintf(stderr, "Write error on pipe\n");

exit(EXIT_FAILURE);

}

bytes_sent += res;

bytes_read = read(data_fd, buffer, PIPE_BUF);

buffer[bytes_read] = '\0';

}

close(pipe_fd);

close(data_fd);

}

else

exit(EXIT_FAILURE);

printf("Process %d finished\n", getpid());

exit(EXIT_SUCCESS);

}

管道讀取端: fiforead.c

#include

#include

#include

#include

#include

#include

#include

#include

int main()

{

const char *fifo_name = "/tmp/my_fifo";

int pipe_fd = -1;

int data_fd = -1;

int res = 0;

int open_mode = O_RDONLY;

char buffer[PIPE_BUF + 1];

int bytes_read = 0;

int bytes_write = 0;

memset(buffer, '\0', sizeof(buffer));

printf("Process %d opening FIFO O_RDONLY\n", getpid());

pipe_fd = open(fifo_name, open_mode);

data_fd = open("DataFormFIFO.txt", O_WRONLY|O_CREAT, 0644);

if (data_fd == -1)

{

fprintf(stderr, "Open file[DataFormFIFO.txt] failed\n");

close(pipe_fd);

return -1;

}

printf("Process %d result %d\n",getpid(), pipe_fd);

if(pipe_fd != -1)

{

do

{

res = read(pipe_fd, buffer, PIPE_BUF);

bytes_write = write(data_fd, buffer, res);

bytes_read += res;

}while(res > 0);

close(pipe_fd);

close(data_fd);

}

else

exit(EXIT_FAILURE);

printf("Process %d finished, %d bytes read\n", getpid(), bytes_read);

exit(EXIT_SUCCESS);

}

(5)有名管道的安全問題

有一種情況是:一個(gè)FIFO文件,有多個(gè)進(jìn)程同時(shí)向同一個(gè)FIFO文件寫數(shù)據(jù),而只有一個(gè)讀FIFO進(jìn)程在同一個(gè)FIFO文件中讀取數(shù)據(jù)時(shí),會(huì)發(fā)生數(shù)據(jù)塊的相互交錯(cuò)。不同進(jìn)程向一個(gè)FIFO讀進(jìn)程發(fā)送數(shù)據(jù)是很普通的情況。這個(gè)問題的解決方法,就是讓寫操作的原子化。系統(tǒng)規(guī)定:在一個(gè)以O(shè)_WRONLY(即阻塞方式)打開的FIFO中, 如果寫入的數(shù)據(jù)長度小于等待PIPE_BUF,那么或者寫入全部字節(jié),或者一個(gè)字節(jié)都不寫入。如果所有的寫請(qǐng)求都是發(fā)往一個(gè)阻塞的FIFO的,并且每個(gè)寫記請(qǐng)求的數(shù)據(jù)長度小于等于PIPE_BUF字節(jié),系統(tǒng)就可以確保數(shù)據(jù)決不會(huì)交錯(cuò)在一起。

上一篇:資深程序員告訴你串口配置的詳細(xì)流程,不容錯(cuò)過

下一篇:imageview的基本屬性介紹,通俗易懂

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部