日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > wenzi嵌入式軟件

概述

管道是?UNIX系統(tǒng)?IPC的最古老的形式,所有的UNIX系統(tǒng)都提供此種通信。所謂的管道,也就是內(nèi)核里面的一串緩存,從管道的一段寫入的數(shù)據(jù),實(shí)際上是緩存在內(nèi)核中的,令一端讀取,也就是從內(nèi)核中讀取這段數(shù)據(jù)。對(duì)于管道傳輸?shù)臄?shù)據(jù)是無格式的流且大小受限。對(duì)于管道來說,也分為匿名管道和命名管道,其中命名管道也被叫做 FIFO,下面則分別闡述這兩種管道。

匿名管道

默認(rèn)情況下,在?Shell命令執(zhí)行過程中,任何一個(gè)命令都有一個(gè)標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)、標(biāo)準(zhǔn)輸出設(shè)備(顯示器)和標(biāo)準(zhǔn)輸出設(shè)備(顯示器),使用管道"|"可以將兩個(gè)命令連接起來,從而改變標(biāo)準(zhǔn)的輸入輸出方式,下面是在 Linux 端運(yùn)行命令行的一個(gè)截圖:

image-20210704161819420
上述命令中的意思也就是,將ls命令得到的結(jié)果作為?grep tags命令的輸入。

image-20210704162803903
連接輸入輸出的中間設(shè)備即為一個(gè)管道文件,綜上,也就是說使用管道可以將一個(gè)命令的輸出作為另一個(gè)命令的輸入(在運(yùn)行的時(shí)候,一個(gè)命令將創(chuàng)建一個(gè)進(jìn)程),而這種管道是臨時(shí)的,命令執(zhí)行完畢之后就會(huì)自動(dòng)消失,這類管道稱為無名管道。

匿名管道例子

匿名管道在使用前要先創(chuàng)建,其函數(shù)的聲明如下:

extern?int?pipe?(int?__pipedes[2]);
此函數(shù)的參數(shù)是一個(gè)整型數(shù)組,如果執(zhí)行成功,pipe 將存儲(chǔ)兩個(gè)整型文件描述符于__pipedes[0]__pipedes[1]中,他們分別指向管道的兩端。如果系統(tǒng)調(diào)用失敗,則返回 -1。

讀無名管道,該函數(shù)的聲明如下:

extern?ssize_t?read?(int?__fd,?void?*__buf,?size_t?__nbytes);
第一個(gè)參數(shù)fd為打開的文件描述符,buf為讀出數(shù)據(jù)的存儲(chǔ)位置,nbytes為讀取數(shù)據(jù)的大小,調(diào)用 read 函數(shù)將從 fd 指向的文件描述符指定的打開文件中宏讀?n?字節(jié)到?buf?指向的緩沖區(qū)內(nèi)。

如果試圖向已經(jīng)填滿的管道寫入,系統(tǒng)會(huì)自動(dòng)阻塞。一個(gè)管道不能同時(shí)被兩個(gè)進(jìn)程打開。

extern?ssize_?t?write(int?__fd,?__const?void?*__buf,?size_t?__n);
從?buf指向的緩沖區(qū)中向管道中寫入nbytes字節(jié),且每次寫入的內(nèi)容都附件在管道的末端。

那要如何使用管道在兩個(gè)進(jìn)程之間通信呢,我們可以使用?fork()創(chuàng)建子進(jìn)程,創(chuàng)建的子進(jìn)程會(huì)復(fù)制父進(jìn)程的文件描述符,這樣就做到了兩個(gè)進(jìn)程各有兩個(gè)fd[0]與fd[1],兩個(gè)進(jìn)程就可以通過各自的fd寫入和讀取同一個(gè)管道文件實(shí)現(xiàn)進(jìn)程通信了,具體原理如下所示:

image-20210704170602297
具體的例子如下所示:

#include
#include
#include

int?main(int?argc,?char?*argv[])
{
????pid_t?pid;
????int?temp;
????int?pipedes[2];
????char?s[14]?=?"test?message!";
????char?d[14];

????if?(pipe(pipedes)?==?-1)?//?創(chuàng)建管道
????{
????????perror("pipe");
????????exit(EXIT_FAILURE);
????}

????if?(pid?==?fork()?==?-1)
????{
????????perror("fork");
????????exit(EXIT_FAILURE);
????}
????else?if?(pid?==?0)??????//?子進(jìn)程
????{
????????printf("now,write?data?to?pipe\n");
????????if?(write(pipedes[1],?s,?14)?==?-1)???//?寫數(shù)據(jù)到管道
????????{
????????????perror("write");
????????????exit(EXIT_FAILURE);
????????}
????????else
????????{
????????????printf("the?written?data?is:%s\n",s);
????????????exit(EXIT_SUCESS);
????????}
????}
????else?if?(pid?>?0)?????//?父進(jìn)程
????{
????????slepp(2);
????????printf("now,?read?from?pipe\n");
????????if?((read(pipedes[0],?d,?14))?==?-1)
????????{
????????????perror("read");
????????????exit(EXIT_FAILURE);
????????}
????????printf("the?data?from?pipe?is:%s\n",d);
????}
????return?0;
}
代碼運(yùn)行的結(jié)果如下所示:

image-20210704172243185

命名管道

命名管道又被稱之為是 FIFO ,未命名的管道只能在兩個(gè)相關(guān)的進(jìn)程之間使用,而且這兩個(gè)相關(guān)的進(jìn)程還要又一個(gè)共同創(chuàng)建了他們的祖先進(jìn)程,但是,通過 FIFO ,不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。

首先,介紹下是如何創(chuàng)建命名管道的:

extern?int?mkfifo?(__const?char?*__path,?__mode_t?__mode);
mkfifo會(huì)根據(jù)參數(shù)建立特殊的有名管道文件,該文件必須不存在,而參數(shù)mode為該文件的權(quán)限。

下面是一個(gè)使用命名管道進(jìn)行進(jìn)程間通信的例子,例子分為兩個(gè)程序,分別是讀部分和寫部分,首先看先往管道寫數(shù)據(jù)的代碼,代碼如下所示:

#include??
#include??
#include??
#include??
#include??
#include??

int?main()?
{?
????int?fd;?

????//?FIFO?file?path?
????char?*?myfifo?=?"/tmp/myfifo";?

????//?Creating?the?named?file(FIFO)?
????//?mkfifo(,?)?
????mkfifo(myfifo,?0666);?

????char?arr1[80],?arr2[80];?
????while?(1)?
????{?
????????//?Open?FIFO?for?write?only?
????????fd?=?open(myfifo,?O_WRONLY);?
????????printf("The?fd?is:%d\n",fd);

????????//?Take?an?input?arr2ing?from?user.?
????????//?80?is?maximum?length?
????????fgets(arr2,?80,?stdin);?

????????//?Write?the?input?arr2ing?on?FIFO?
????????//?and?close?it?
????????write(fd,?arr2,?strlen(arr2) 1);?
????????close(fd);?

????????//?Open?FIFO?for?Read?only?
????????fd?=?open(myfifo,?O_RDONLY);?

????????//?Read?from?FIFO?
????????read(fd,?arr1,?sizeof(arr1));?

????????//?Print?the?read?message?
????????printf("User2:?%s",?arr1);?
????????close(fd);?
????}?
????return?0;?
}
然后是先往管道讀數(shù)據(jù)的代碼,代碼如下所示:

#include??
#include??
#include??
#include??
#include??
#include??

int?main()?
{?
????int?fd1;?

????//?FIFO?file?path?
????char?*?myfifo?=?"/tmp/myfifo";?

????char?str1[80],?str2[80];?
????while?(1)?
????{?
????????//?First?open?in?read?only?and?read?
????????fd1?=?open(myfifo,O_RDONLY);?
????????printf("The?fd?is:%d\n",fd1);
????????read(fd1,?str1,?80);?

????????//?Print?the?read?string?and?close?
????????printf("User1:?%s",?str1);?
????????close(fd1);?

????????//?Now?open?in?write?mode?and?write?
????????//?string?taken?from?user.?
????????fd1?=?open(myfifo,O_WRONLY);?
????????fgets(str2,?80,?stdin);?
????????write(fd1,?str2,?strlen(str2) 1);?
????????close(fd1);?
????}?
????return?0;?
}?
下面是代碼運(yùn)行的一個(gè)結(jié)果:

image-20210706132916572
說明一下,就是說當(dāng)運(yùn)行?write程序的時(shí)候,會(huì)創(chuàng)建fifo文件,命名管道,然后,在?write文件中就執(zhí)行open操作,但是,這里存在的一個(gè)問題就是,因?yàn)樵谶\(yùn)行?write程序的時(shí)候,沒有進(jìn)程打開讀端,也就阻塞了?open函數(shù)的運(yùn)行,只有運(yùn)行read操作,以讀的方式讀取管道的數(shù)據(jù),這樣才能使得write中的open函數(shù)繼續(xù)執(zhí)行。

綜上,也就是命名管道在進(jìn)程中通信的一個(gè)例子。

小結(jié)

上述就是本次進(jìn)程通信中關(guān)于管道的相關(guān)內(nèi)容,其中就包括匿名管道以及命名管道,他們之間存在著差別嗎,也各有各的應(yīng)用,本次的分享就到這里啦~

你點(diǎn)的每個(gè)好看,我都認(rèn)真當(dāng)成了喜歡
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉