日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对OS实验中的“管道”的一点儿理解

發布時間:2025/6/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对OS实验中的“管道”的一点儿理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

管道通信機制
管道 pipe 是進程間通信最基本的一種機制。在內存中建立的管道稱為無名管道,
在磁盤上建立的管道稱為有名管道。無名管道隨著進程的撤消而消失,有名管道則可
以長久保存,shell 命令符| 建立的就是無名管道,而 shell 命令 mkfifo 建立的是有名
管道。兩個進程可以通過管道一個在管道一端向管道發送其輸出,給另一進程可以在
管道的另一端從管道得到其輸入.管道以半雙工方式工作,即它的數據流是單方向的.
因此使用一個管道一般的規則是讀管道數據的進程關閉管道寫入端,而寫管道進程關
閉其讀出端
。管道既可以采用同步方式工作也可以采用異步方式工作。

對“讀管道數據的進程關閉管道寫入端,而寫管道進程關閉其讀出端”的理解:
用反證法的思想,假如寫管道的進程關閉管道寫入端,那么,讀管道進程已經不想讀管道了,寫管道進程還在源源不斷地寫入數據,那么管道是不是就會太慢而導致“炸裂”?,所以是讀管道進程關閉管道的寫入端。而寫管道的進程關閉讀出端,也很好理解,寫管道的進程不想寫了,它就關閉讀出端,讀管道進程讀完管道中剩余的數據后自然也讀不到數據了。
上面這句話的意思是,讀管道數據的進程在讀數據之前要關閉管道寫入端,寫管道進程在寫數據之前關閉其讀出端,在讀管道數據的進程讀完數據之后,關閉管道的讀出端(0端),寫管道進程在寫完數據之后關閉其寫入端(1端)。

匿名管道的局限性主要有兩點:一是由于管道建立在內存中,所以它的容量不可能很大;二是管道所傳送的是無格式字節流,這就要求使用管道的雙方實現必須對傳輸的數據格式進行約定。

例子:在父子進程之間利用匿名管道通信。

#include <unist.h>
#include <string.h>
#include <wait.h>
#include <stdio.h>

#define MAX_LINE 80

int main()
{
int testPipe[2], ret;
char buf[MAX_LINE + 1];
const char * testbuf = “主程序發送的數據”;

if (pipe(testbuf) == 0) {if (fork() == 0) {ret = read(testPipe[0], buf, MAX_LINE);buf[ret] = 0;printf("子程序讀到的數據為:%s", buf);close(testPipe[0]);}else {ret = write(testPipe[1], testbuf, strlen(testbuf));ret = wait(NULL);close(testPipe[1]);} }return 0;

}

————————————————
版權聲明:本文為CSDN博主「Yngz_Miao」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38410730/article/details/81569852

pipe 系統調用的語法為:
#include <unistd.h>
int pipe(int pipe_id[2]);
pipe 建立一個無名管道,pipe_id[0]中和 pipe_id[1]將放入管道兩端的描述符,如果
pipe 執行成功返回 0。.出錯返回-1.
管道讀寫的系統調用語法為:
#include <unistd.h>
ssize_t read(int pipe_id,const void *buf,size_t count);
ssize_t write(int pipe_id,const void *buf,size_t count);

read 和 write 分別在管道的兩端進行讀和寫。
pipe_id 是 pipe 系統調用返回的管道描述符。
Buf 是數據緩沖區首地址,
count 說明數據緩沖區以 size_t 為單位的長度。
read 和 write 的返回值為它們實際讀寫的數據單位。

注意1.管道的讀寫默認的通信方式為同步讀寫方式,即如果管道讀端無數據則讀者阻塞直到數據到達,反之如果管道寫端有數據則寫者阻塞直到數據被讀走。
注意2.上面說“Buf 是數據緩沖區首地址”,這里的數據緩沖區不要誤以為是管道對應一片數據緩沖區,而是,往管道里寫入數據時,可以把已有的一個數據緩沖區作為寫入數據的數據來源,例如:這時的數據緩沖區可以是已經定義好內容的一個字符數組,那么這是一個“輸入數據緩沖區”或者“寫入數據緩沖區”,而從管道中讀出數據時,把讀出來的數據放在哪里呢?可以事先定義一個字符數組,然后把此數組名作為參數傳入read()函數中,以便把讀出的數據存放在這個數組中,那么,這個數組就相當于一個"輸出數據緩沖區”/“讀出數據緩沖區”,第三個參數可以傳入數據緩沖區的大小(可以是你此前定義好的數組的大小)

疑問:
1.有管道的容量這個概念嗎?每次最多可以寫入或者讀出多少個數據呢?
答:好像沒有限制,讀多少都可以?是面向字節流的。
命令 ulimit -a可以查看管道的大小,這是內核設定的為8*512byte=4k bit

管道的創建

管道是一種最基本的進程間通信機制。管道由pipe函數來創建:

SYNOPSIS
#include <unistd.h>
int pipe(int pipefd[2]);
調用pipe函數,會在內核中開辟出一塊緩沖區用來進行進程間通信,這塊緩沖區稱為管道,它有一個讀端和一個寫端。

pipe函數接受一個參數,是包含兩個整數的數組,如果調用成功,會通過pipefd[2]傳出給用戶程序兩個文件描述符,需要注意pipefd [0]指向管道的讀端, pipefd [1]指向管道的寫端,那么此時這個管道對于用戶程序就是一個文件,可以通過read(pipefd [0]);或者write(pipefd [1])進行操作。pipe函數調用成功返回0,否則返回-1。

pipe的特點:

  • 只能單向通信

  • 只能血緣關系的進程進行通信

  • 依賴于文件系統

    4、生命周期隨進程

  • 面向字節流的服務

  • 管道內部提供了同步機制

  • 說明:因為管道通信是單向的,在上面的例子中我們是通過子進程寫父進程來讀,如果想要同時父進程寫而子進程來讀,就需要再打開另外的管道;

    管道的讀寫端通過打開的文件描述符來傳遞,因此要通信的兩個進程必須從它們的公共祖先那里繼承管道的件描述符。 上面的例子是父進程把文件描述符傳給子進程之后父子進程之 間通信,也可以父進程fork兩次,把文件描述符傳給兩個子進程,然后兩個子進程之間通信, 總之 需要通過fork傳遞文件描述符使兩個進程都能訪問同一管道,它們才能通信。(自己在實驗過程中發現,程序中不一定要有fork()才能使用管道,同一個進程的多個線程也可以使用管道通信)

    四個特殊情況:

  • 如果所有指向管道寫端的文件描述符都關閉了,而仍然有進程從管道的讀端讀數據,那么管道中剩余的數據都被讀取后,再次read會返回0,就像讀到文件末尾一樣

  • 如果有指向管道寫端的文件描述符沒關閉,而持有管道寫端的進程也沒有向管道中寫數據,這時有進程從管道讀端讀數據,那么管道中剩余的數據都被讀取后,再次read會阻塞,直到管道中有數據可讀了才讀取數據并返回。

  • 如果所有指向管道讀端的文件描述符都關閉了,這時有進程指向管道的寫端write,那么該進程會收到信號SIGPIPE,通常會導致進程異常終止。

  • 如果有指向管道讀端的文件描述符沒關閉,而持有管道寫端的進程也沒有從管道中讀數據,這時有進程向管道寫端寫數據,那么在管道被寫滿時再write會阻塞,直到管道中有空位置了才寫入數據并返回。

  • 此段的參考來源:https://blog.csdn.net/qq_36829091/article/details/80138836
    ·································································································

    LINUX 管道實現的機制

    從本質上說,管道也是一種文件,但他又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題

    • 限制管道的大小。實際上,管道是一個固定大小的緩沖區。在Linux中該換沖區的大小為一頁,4k

    使得他的大小不像文件那樣不加檢驗的增長。使用固定緩沖區也會帶來問題,比如再寫管道時可能變滿

    當這種情況發生時,隨后對管道的write()調用被阻塞,等待某些數據被讀取,以便騰出足夠的空間供

    write()調用。

    • 讀取工作也可能比寫的進程快。當所有進程的數據被讀取完時,一個隨后的read()調用將默認的被阻塞、

    管道變空。這種情況發生時,一個隨后的read()調用將被默認的阻塞,等待某些數據被寫入,這樣就解決了read()

    調用將被默認的阻塞,等待某些數據將被寫入,這解決了read()調用返回文件結束的問題。
    ————————————————
    版權聲明:上面一段為CSDN博主「魏爾肖」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/qq_35116353/article/details/60963287

    總結

    以上是生活随笔為你收集整理的对OS实验中的“管道”的一点儿理解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美黄视频 | 一个人看的www片免费高清中文 | 中文字幕一区二区不卡 | 欧美激情在线播放 | 97久久国产精品 | 6080成人| 国产福利视频一区二区三区 | 国产精品久久久久久久专区 | 一区二区三区视频在线播放 | 交视频在线播放 | 欧美日韩一级二级三级 | 清冷学长被爆c躁到高潮失禁 | 男女在楼梯上高潮做啪啪 | av在线不卡观看 | 草逼视频网 | 亚洲国产中文字幕 | 国产网站在线看 | √资源天堂中文在线 | 求毛片网站| 99免费精品视频 | 久久精品国产亚洲av久一一区 | 精品乱码久久久久久中文字幕 | 成人精品免费 | 开心激情站 | 白石茉莉奈中文字幕在 | 国模av在线| 中文亚洲字幕 | 日本熟妇一区二区三区四区 | 狠狠操在线播放 | 国产3区 | 国产精品极品白嫩在线 | 99久久九九 | jizz黄| 欧美性xxxxx| 日韩久久免费视频 | 欧美一级淫片免费视频魅影视频 | 日韩在线激情视频 | 亚洲国产无线乱码在线观看 | 人与动物2免费观看完整版电影高清 | 国产精品-区区久久久狼 | 久久123 | 日韩av一区二区三区 | 日本xxxx在线观看 | 欧美xo影院 | 中文字幕巨乳 | 郑艳丽三级 | 少妇无套高潮一二三区 | 色窝窝无码一区二区三区成人网站 | 在线观看日韩一区 | 午夜三级在线观看 | 99国产精品99| 97在线播放免费观看 | 国产成人在线免费 | 东京热一区二区三区四区 | 国产你懂| 国产精品午夜影院 | 中国少妇毛片 | 国产一区二区 | 九一精品一区 | 日韩在线视频不卡 | 精品伦精品一区二区三区视频密桃 | 国产午夜视频在线 | 手机看片福利视频 | 一区二区精品免费 | 欧美成人精品一区二区三区 | 国产女人18水真多毛片18精品 | 这里只有精品久久 | 日韩在线观看免费av | 99久久国产免费 | 亚洲欧美日韩国产精品 | 亚洲欧美日韩精品一区 | 国产丰满大乳奶水在线视频 | 国产内谢 | 日韩精品一区二区三区不卡 | 岛国免费av | 成年人黄色免费网站 | 亚洲午夜18毛片在线看 | 亚洲 高清 成人 动漫 | 日本二区三区视频 | 无码人妻精品一区二区 | 激情内射亚洲一区二区三区爱妻 | 日韩xxx视频 | 久久久久久久久久久久久久国产 | 国产污视频在线观看 | 日本一区二区三区免费看 | 欧美鲁鲁 | 久久精品一区二区三 | 自拍偷拍亚洲一区 | 国产成人精品无码播放 | av一二三四区 | 男女啪动最猛动态图 | 欧美123区 | 久色伊人 | 日本一区二区三区在线免费观看 | 日本精品视频一区二区 | 欧美整片在线 | 国产噜噜噜噜久久久久久久久 | 爱情岛论坛永久入址测速 | 男女一起插插插 |