在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

管道數(shù)據(jù)流"實(shí)時(shí)性" 和使用小提示

Linux愛好者 ? 來源:YXQ ? 2019-08-09 17:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

相信很多在linux平臺(tái)工作的童鞋, 都很熟悉管道符 '|', 通過它, 我們能夠很靈活的將幾種不同的命令協(xié)同起來完成一件任務(wù)

不過這次咱們不來說這些用法, 而是來探討一些更加有意思的, 那就是管道兩邊的數(shù)據(jù)流"實(shí)時(shí)性"和管道使用的小提示.

其實(shí)我們?cè)诶霉艿赖臅r(shí)候, 可能會(huì)不經(jīng)意的去想, 我前一個(gè)命令的輸出, 是全部處理完再通過管道傳給第二個(gè)命令, 還是一邊處理一邊輸出呢? 可能在大家是試驗(yàn)中或者工作經(jīng)驗(yàn)中, 應(yīng)該是左邊的命令全部處理完再一次性交給右邊的命令進(jìn)行處理, 不光是大家, 我在最初接觸管道時(shí), 也曾有這么一個(gè)誤會(huì), 因?yàn)槲覀兺ㄟ^現(xiàn)象看到的就是這樣.

但其實(shí)只要有簡單了解過管道這工具, 應(yīng)該都不難得出解釋:

管道是兩邊是同時(shí)進(jìn)行, 也就是說, 左邊的命令輸出到管道, 管道的右邊將馬上進(jìn)行處理.

管道的定義

管道是由內(nèi)核管理的一個(gè)緩沖區(qū),相當(dāng)于我們放入內(nèi)存中的一個(gè)紙條。管道的一端連接一個(gè)進(jìn)程的輸出。這個(gè)進(jìn)程會(huì)向管道中放入信息。管道的另一端連接一個(gè)進(jìn)程的輸入,這個(gè)進(jìn)程取出被放入管道的信息。一個(gè)緩沖區(qū)不需要很大,它被設(shè)計(jì)成為環(huán)形的數(shù)據(jù)結(jié)構(gòu),以便管道可以被循環(huán)利用。當(dāng)管道中沒有信息的話,從管道中讀取的進(jìn)程會(huì)等待,直到另一端的進(jìn)程放入信息。當(dāng)管道被放滿信息的時(shí)候,嘗試放入信息的進(jìn)程會(huì)堵塞,直到另一端的進(jìn)程取出信息。當(dāng)兩個(gè)進(jìn)程都終結(jié)的時(shí)候,管道也自動(dòng)消失。

管道工作流程圖

通過上面的解釋可以看到, 假設(shè) COMMAND1 | COMMAND2, 那么COMMAND1的標(biāo)準(zhǔn)輸出, 將會(huì)被綁定到管道的寫端, 而COMMAND2的標(biāo)準(zhǔn)輸入將會(huì)綁定到管道的讀端, 所以當(dāng)COMMAND1一有輸出, 將會(huì)馬上通過管道傳給COMMAND2, 我們先來做個(gè)實(shí)驗(yàn)驗(yàn)證下:

#1.pyimporttimeimportsyswhile1:print'1111'time.sleep(3)print'2222'time.sleep(3)
[root@iZ23pynfq19Z~]#python1|cat

在上面的命令, 我們可以猜測(cè)下輸出結(jié)果: 究竟是 睡眠6秒之后, 輸出"1111222", 還是輸出 "1111" 睡眠3秒, 再輸出 "2222", 然后再睡眠3秒, 再輸出"1111" 呢? 答案就是: 都不是! what! 這不可能, 大家可以嘗試下, 我們會(huì)看到終端沒反應(yīng)了, 為什么呢? 這就要涉及到文件IO的緩沖方式了,關(guān)于文件IO, 可以參考我的另一篇文章:淺談文件描述符1和2, 在最下面的地方提到文件IO的三種緩沖方式:

全緩沖:直到緩沖區(qū)被填滿,才調(diào)用系統(tǒng)I/O函數(shù), (一般是針對(duì)文件)

行緩沖: 遇到換行符就輸出(標(biāo)準(zhǔn)輸出)

無緩沖:沒有緩沖區(qū),數(shù)據(jù)會(huì)立即讀入或者輸出到外存文件和設(shè)備上(標(biāo)準(zhǔn)錯(cuò)誤

因?yàn)閜ython是默認(rèn)采用帶緩沖的fputs(參考py27源碼: fileobject.c: PyFile_WriteString函數(shù)),又因?yàn)闃?biāo)準(zhǔn)輸出被改寫到管道, 所以將會(huì)采取全緩沖的方式(shell 命令具體要看實(shí)現(xiàn), 因?yàn)橛行┦怯貌粠Ь彌_write實(shí)現(xiàn),如果不帶緩沖區(qū),會(huì)直接寫入管道), 所以將會(huì)采取全緩沖的方式, 也就是說, 直到緩沖區(qū)被填滿, 或者手動(dòng)顯示調(diào)用flush刷入,才能看到輸出.那我們可以將代碼改寫成下面兩種方式吧

#方式1:填滿緩沖區(qū),我這邊大小是4096字節(jié),你們也可以試下這個(gè)值,估計(jì)都一樣importtimeimportsyswhile1:print'1111'*4096time.sleep(3)print'2222'*4096time.sleep(3)#方式2:手動(dòng)刷入寫隊(duì)列importtimeimportsyswhile1:print'1111'sys.stdout.flush()//因?yàn)槭菢?biāo)準(zhǔn)輸出,所以直接通過sys的接口去flushtime.sleep(3)print'2222'sys.stdout.flush()time.sleep(3)

輸出結(jié)果:


#第一種方式:[root@iZ23pynfq19Z~]#python1|cat1111.....(超多1,刷屏了..)睡眠3秒..2222.....(超多2,刷屏了..)#第二種方式:[root@iZ23pynfq19Z~]#python1|cat1111睡眠3秒..2222睡眠3秒..1111....

在這里我們已經(jīng)能夠得出結(jié)果, 如果像我們以前所想的那樣, 要等到COMMAND1全部執(zhí)行完才一次性輸出給COMMAND2, 那么結(jié)果應(yīng)該是無限堵塞..因?yàn)槲业某绦蛞恢睕]有執(zhí)行完..這樣應(yīng)該是不符合老前輩們?cè)O(shè)計(jì)初衷的, 因?yàn)檫@樣可能會(huì)導(dǎo)致管道越來越大..然而管道也是有大小的~ 具體可以去看posix標(biāo)準(zhǔn), 所以我們得出結(jié)論是: 只要COMMAND1的輸出寫入管道的寫端(不管是緩沖區(qū)滿還是手動(dòng)flush), COMMAND2都將立刻得到數(shù)據(jù)并且馬上處理.

那么管道兩邊的數(shù)據(jù)流"實(shí)時(shí)性"討論到就先暫告一段落, 接下來將在這個(gè)基礎(chǔ)上繼續(xù)討論:管道使用的小提示.

在開始討論前, 我想先引入一個(gè)專業(yè)術(shù)語, 也是我們偶爾會(huì)遇到的, 那就是:SIGPIPE或者是一個(gè)更加具體的描述:broken pipe (管道破裂)

上面的專業(yè)術(shù)語都是跟管道讀寫規(guī)則息息相關(guān)的, 那咱們來看下 管道的讀寫規(guī)則吧:

當(dāng)沒有數(shù)據(jù)可讀時(shí)

O_NONBLOCK (未設(shè)置):read調(diào)用阻塞,即進(jìn)程暫停執(zhí)行,一直等到有數(shù)據(jù)來到為止。

O_NONBLOCK ( 設(shè)置 ) :read調(diào)用返回-1,errno值為EAGAIN。

當(dāng)管道滿的時(shí)候

O_NONBLOCK (未設(shè)置):write調(diào)用阻塞,直到有進(jìn)程讀走數(shù)據(jù)

O_NONBLOCK ( 設(shè)置 ):調(diào)用返回-1,errno值為EAGAIN

如果所有管道寫端對(duì)應(yīng)的文件描述符被關(guān)閉,則read返回0

如果所有管道讀端對(duì)應(yīng)的文件描述符被關(guān)閉,則write操作會(huì)產(chǎn)生信號(hào)SIGPIPE

當(dāng)要寫入的數(shù)據(jù)量不大于PIPE_BUF時(shí),linux將保證寫入的原子性。

當(dāng)要寫入的數(shù)據(jù)量大于PIPE_BUF時(shí),linux將不再保證寫入的原子性。

在上面我們可以看到, 如果我們收到SIGPIPE信號(hào), 那么一般情況就是讀端被關(guān)閉, 但是寫端卻依舊嘗試寫入

咱們來重現(xiàn)下SIGPIPE

#!/usr/bin/pythonimporttimeimportsyswhile1:time.sleep(10)#手速不夠快的童鞋可以將睡眠時(shí)間設(shè)置長點(diǎn)print'1111'sys.stdout.flush()

這次執(zhí)行命令需要考驗(yàn)手速了, 因?yàn)槲覀円s在py醒過來之前, 將讀端進(jìn)程殺掉

python1|cat------------------------#另一個(gè)終端[root@iZ23pynfq19Z~]#ps-fe|grep-P'cat|python'root107754074000:05pts/200:00:00python1root107764074000:05pts/200:00:00cat#讀端進(jìn)程root1083332581000:06pts/000:00:00grep-Pcat|python[root@iZ23pynfq19Z~]#kill10776

輸出結(jié)果

[root@iZ23pynfq19Z~]#python1|catTraceback(mostrecentcalllast):File"1",line6,insys.stdout.flush()IOError:[Errno32]BrokenpipeTerminated

從上圖我們可以驗(yàn)證兩個(gè)點(diǎn):

當(dāng)我們殺掉讀端時(shí), 寫端會(huì)收到SIGPIPE而默認(rèn)退出, 管道結(jié)束

當(dāng)我們殺掉讀端時(shí), 寫端的程序并不會(huì)馬上收到SIGPIPE, 相反的, 只有真正寫入管道寫端時(shí)才會(huì)觸發(fā)這個(gè)錯(cuò)誤

如果寫入一個(gè) 讀端已經(jīng)關(guān)閉的管道, 將會(huì)收到一個(gè)SIGPIPE, 那讀一個(gè)寫端已經(jīng)關(guān)閉的管道又會(huì)這樣呢?

importtimeimportsys#這次我們不需要死循環(huán),因?yàn)槲覀兿胍獙懚丝禳c(diǎn)關(guān)閉退出time.sleep(5)print'1111'sys.stdout.flush()
#因?yàn)槲覀兿胍x端等到足夠長的時(shí)間,讓寫端關(guān)閉,所以我們需要利用awk先睡眠10秒[root@iZ23pynfq19Z~]#python1.py|awk'{system("sleep10");print123}'------------------------[root@iZ23pynfq19Z~]#ps-fe|grep-P'awk|python'root117174074000:20pts/200:00:00python1.pyroot117184074000:20pts/200:00:00awk{system("sleep10");print123}root1172132581000:20pts/000:00:00grep-Pawk|python#5秒過后[root@iZ23pynfq19Z~]#ps-fe|grep-P'awk|python'root116854074000:20pts/200:00:00awk{system("sleep10");print123}root1169832581000:20pts/000:00:00grep-Pawk|python#10秒過后[root@iZ23pynfq19Z~]#python1|awk'{system("sleep10");print123}'123

在上面也已經(jīng)證明了上文提到的讀寫規(guī)則: 如果所有管道寫端對(duì)應(yīng)的文件描述符被關(guān)閉,將產(chǎn)生EOF結(jié)束標(biāo)志,read返回0, 程序退出。

總結(jié)

通過上面的理論和實(shí)驗(yàn), 我們知道在使用管道時(shí), 兩邊命令的數(shù)據(jù)傳輸過程, 以及對(duì)管道讀寫規(guī)則有了初步的認(rèn)識(shí), 希望我們以后在工作時(shí), 再接觸管道時(shí), 能夠更加有把握的去利用這一強(qiáng)大的工具。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11497

    瀏覽量

    213288
  • 管道
    +關(guān)注

    關(guān)注

    3

    文章

    146

    瀏覽量

    18180

原文標(biāo)題:聊聊 Linux 的匿名管道

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    大眾數(shù)據(jù)流分析

    、3.0發(fā)動(dòng)機(jī)數(shù)據(jù)流定義與解釋別克君威2.0發(fā)動(dòng)機(jī)數(shù)據(jù)流定義與解釋凱越數(shù)據(jù)流列表凱越發(fā)動(dòng)機(jī)數(shù)據(jù)流定義賽歐數(shù)據(jù)流列表賽歐
    發(fā)表于 06-15 12:28

    探測(cè)小提示

    選擇滿足示波器和應(yīng)用需求的探頭,可以使您能夠進(jìn)行必要的測(cè)量。實(shí)際上,進(jìn)行測(cè)量和獲得有用的結(jié)果還取決于怎樣使用工具。下面的探測(cè)小提示將有助于您避免某些常見的測(cè)量問題。補(bǔ)償探頭大多數(shù)探頭是為與特定
    發(fā)表于 12-17 17:12

    部署實(shí)時(shí)數(shù)據(jù)流平臺(tái)面臨的挑戰(zhàn)有哪些?

    部署實(shí)時(shí)數(shù)據(jù)流平臺(tái)面臨的五大挑戰(zhàn)
    發(fā)表于 03-17 07:00

    LabVIEW數(shù)據(jù)流控制方法研究

    本文剖析了LabVIEW 數(shù)據(jù)流語言的特點(diǎn),提供了其若干有效控制方法,指出LabVIEW 本身即可解決數(shù)據(jù)流控制上的變量沖突、響應(yīng)時(shí)序控制、初始狀態(tài)自適應(yīng)調(diào)整等問題并保證其通用
    發(fā)表于 07-30 11:39 ?13次下載

    基于數(shù)據(jù)流的Java字節(jié)碼分析

    本文基于數(shù)據(jù)流框架理論,提出了如何將數(shù)據(jù)流分析方法應(yīng)用于JAVA 字節(jié)碼中,通過建立數(shù)據(jù)流與半格、數(shù)據(jù)流和函數(shù)調(diào)用圖的關(guān)系,從而對(duì)類型信息進(jìn)行分析。實(shí)驗(yàn)表明該
    發(fā)表于 12-25 13:22 ?9次下載

    網(wǎng)絡(luò)數(shù)據(jù)流存儲(chǔ)算法分析與實(shí)現(xiàn)

    針對(duì)網(wǎng)絡(luò)數(shù)據(jù)流存儲(chǔ)的瓶頸問題,提出了一種網(wǎng)絡(luò)數(shù)據(jù)流存儲(chǔ)算法分析與實(shí)現(xiàn)方法,仿真結(jié)果表明,模型能顯著提高網(wǎng)絡(luò)數(shù)據(jù)流實(shí)時(shí)存儲(chǔ)能力
    發(fā)表于 05-26 15:57 ?21次下載
    網(wǎng)絡(luò)<b class='flag-5'>數(shù)據(jù)流</b>存儲(chǔ)算法分析與實(shí)現(xiàn)

    基于FPGA芯片的數(shù)據(jù)流結(jié)構(gòu)分析

    的兼容。 這里詳細(xì)介紹了Virtex 系列FPGA 芯片的數(shù)據(jù)流大小及結(jié)構(gòu)。Virtex支持一些新的非常強(qiáng)大的配置模式,包括部分重新配置,這種配置機(jī)制被設(shè)計(jì)到高級(jí)應(yīng)用中,以便通過芯片的配置接口能夠訪問及操作片內(nèi)數(shù)據(jù)。但想要配置
    發(fā)表于 11-18 11:37 ?2640次閱讀

    數(shù)據(jù)流編程模型優(yōu)化

    數(shù)據(jù)流編程模型將程序的計(jì)算與通信分離,暴露了應(yīng)用程序潛在的并行并簡化了編程難度。分布式計(jì)算框架利用廉價(jià)PC構(gòu)建多核集群解決了大規(guī)模并行計(jì)算問題,但多核集群層次存儲(chǔ)結(jié)構(gòu)和處理單元對(duì)數(shù)據(jù)流
    發(fā)表于 11-23 15:48 ?3次下載
    <b class='flag-5'>數(shù)據(jù)流</b>編程模型優(yōu)化

    數(shù)據(jù)環(huán)境下的分布式數(shù)據(jù)流處理關(guān)鍵技術(shù)探析

    數(shù)據(jù)環(huán)境下的數(shù)據(jù)流處理實(shí)時(shí)性要求高,數(shù)據(jù)計(jì)算要求持續(xù)和高可靠。分布式
    發(fā)表于 12-05 19:04 ?0次下載
    大<b class='flag-5'>數(shù)據(jù)</b>環(huán)境下的分布式<b class='flag-5'>數(shù)據(jù)流</b>處理關(guān)鍵技術(shù)探析

    數(shù)據(jù)流的網(wǎng)絡(luò)實(shí)時(shí)入侵檢測(cè)

    針對(duì)計(jì)算機(jī)網(wǎng)絡(luò)訪問請(qǐng)求具有實(shí)時(shí)到達(dá)以及動(dòng)態(tài)變化的特點(diǎn),為了實(shí)時(shí)檢測(cè)網(wǎng)絡(luò)入侵,并且適應(yīng)網(wǎng)絡(luò)訪問數(shù)據(jù)的動(dòng)態(tài)變化,提出一個(gè)基于數(shù)據(jù)流的網(wǎng)絡(luò)入侵實(shí)時(shí)
    發(fā)表于 01-17 10:09 ?0次下載
    <b class='flag-5'>數(shù)據(jù)流</b>的網(wǎng)絡(luò)<b class='flag-5'>實(shí)時(shí)</b>入侵檢測(cè)

    時(shí)間數(shù)據(jù)流的并行檢測(cè)算法

    針對(duì)現(xiàn)有長持續(xù)時(shí)間數(shù)據(jù)流檢測(cè)算法的實(shí)時(shí)差、檢測(cè)精度與估計(jì)精度低的問題,提出長持續(xù)時(shí)間數(shù)據(jù)流的并行檢測(cè)算法。基于共享數(shù)據(jù)結(jié)構(gòu)的長持續(xù)時(shí)間
    發(fā)表于 03-06 15:54 ?0次下載
    時(shí)間<b class='flag-5'>數(shù)據(jù)流</b>的并行檢測(cè)算法

    數(shù)據(jù)流是什么

    數(shù)據(jù)流最初是通信領(lǐng)域使用的概念,代表傳輸中所使用的信息的數(shù)字編碼信號(hào)序列。然而,我們所提到的數(shù)據(jù)流概念與此不同。這個(gè)概念最初在1998年由Henzinger在文獻(xiàn)87中提出,他將數(shù)據(jù)流定義為“只能以事先規(guī)定好的順序被讀取一次的
    的頭像 發(fā)表于 02-27 15:25 ?7424次閱讀

    控制數(shù)據(jù)流的區(qū)別

    控制數(shù)據(jù)流的區(qū)別? 在計(jì)算機(jī)科學(xué)中,控制數(shù)據(jù)流是兩個(gè)非常重要的概念。雖然它們經(jīng)常一起使用,但它們具有非常不同的含義。本文將討論控制
    的頭像 發(fā)表于 09-13 11:17 ?7088次閱讀

    示波器探頭的探測(cè)小提示

    選擇滿足示波器和應(yīng)用需求的探頭,可以使您能夠進(jìn)行必要的測(cè)量。實(shí)際上,進(jìn)行測(cè)量和獲得有用的結(jié)果還取決于怎樣使用工具。下面的探測(cè)小提示將有助于您避免某些常見的測(cè)量問題: 補(bǔ)償探頭 大多數(shù)探頭是為與特定
    的頭像 發(fā)表于 07-23 10:53 ?463次閱讀
    示波器探頭的探測(cè)<b class='flag-5'>小提示</b>

    理解ECU數(shù)據(jù)流的分析方法

    隨著汽車電子化程度的提高,ECU在車輛中扮演的角色越來越重要。它們不僅控制著發(fā)動(dòng)機(jī)管理、變速箱、制動(dòng)系統(tǒng)等關(guān)鍵功能,還涉及到車輛的舒適和安全。 ECU數(shù)據(jù)流分析的重要 故障診斷
    的頭像 發(fā)表于 11-05 11:07 ?1164次閱讀
    主站蜘蛛池模板: 在线观看jyzzjyzz | 色在线视频播放 | 奇米影视婷婷 | 操操操综合 | 狠狠色狠狠色综合婷婷tag | 精品视频一区二区三区四区五区 | 色无五月 | 男女交性视频免费播放 | 亚洲综合香蕉 | xxxxxx日本老师hd68 | 无毒不卡 | 97色网| 亚洲性视频网站 | 伊人久久大香线蕉影院95 | 久久久久久青草大香综合精品 | 国产成人a一区二区 | 在线成人 | 日本一道高清不卡免费 | 久久精品成人免费网站 | 欧美性a欧美在线 | 免费在线你懂的 | 欧美卡一卡二卡新区网站 | 天天操天天做 | 特黄特黄视频 | 日本一视频一区视频二区 | 毛片日韩 | 国产精品高清免费网站 | 国产成人综合欧美精品久久 | 一本大道香蕉大vr在线吗视频 | 美女扒开尿口给男人桶视频免费 | 国产精品成人一区二区三区 | 亚洲爱爱图片 | 黄色毛片子 | 日本免费一区二区在线观看 | 精品久久香蕉国产线看观看亚洲 | a久久久久一级毛片护士免费 | 3p高h文| 天天干天天操天天干 | 色妞在线| 97在线人人 | 中文字幕在线观看一区 |