linux系統程式設計學習day5 IPC之管道

2021-08-13 19:48:14 字數 1738 閱讀 8732

管道這個方式個人感覺真的是非常簡單的,先簡述一下管道的概念:

管道的概念就是這些,需要注意一下的是什麼是偽檔案,還有就是半雙工這兩個概念。

偽檔案:

這裡管道的偽檔案其實就是一塊核心的緩衝區,把資料都放在這片緩衝區裡面然後進行讀寫操作,偽檔案系統是乙個linux裡面的乙個概念,有興趣的可以查閱一下相關的資料,有很多種偽檔案,都代表不懂得意義。

半雙工通訊方式:

這個概念的話如果有一些嵌入式基礎的會好理解的多,嵌入式裡面有各種通訊方式,單工,半雙工,全雙工這些。

半雙工就是指資料可以在乙個訊號載體的兩個方向上傳輸,但是不能同時傳輸,比如我這邊可以讀寫你那邊也能讀寫,但是我讀的時候我不能寫入,我寫入的時候不能讀取,在某一時刻資料只能在某乙個方向流動,這就是半雙工,單工就是完全單向的,全雙工相應的就是讀寫可以同時進行的,在嵌入式裡面的話有幾個典型的半雙工模式,例如i2c通訊,rs-485等。

管道更加通俗易懂得來闡述它得概念的話就是字面意思了,就把它理解成一根水管,這根水管連線到了兩個木桶裡面或者兩個池子裡面,資料就是管道裡面的水,如果我想從木桶a裡面的水流到木桶b那麼就需要把木桶a抬高,水流利用重力自然而然地從a到b,但是b不能到a,相反亦然。

概念理解了之後就只是如何使用的問題了,使用也十分簡單,就僅僅乙個pipe函式而已,pipe函式具體用法可以在linux得man page檢視, man 2 pipe出現如下頁面

函式原型可以看出返回值是int型,預設的失敗返回-1的然後引數裡面的 int pipefd[2]這是乙個傳入引數,需要我們在外部定義乙個包含兩個檔案描述符的陣列,這個陣列就是我們的管道,很簡單,如果我們需要呼叫這個管道那麼就只需要在建立出來的管道裡面用wirte(fd[1],...,...), 這個value就是你需要傳入的值,這裡1定義為寫入,0定義為讀取,如果你需要讀取資料就只需要read(fd[0],...,...),十分的簡單。

下面的 int pipe2(int pipefd[2], int flags);

多了乙個flags引數,這個引數在下面也有詳細的說明,這裡不細說了。

需要注意一下:

1.pipe只能在有血緣關係的程序裡面進行使用,且pipe的呼叫必須要在fork之前。

這個應該很好理解,畢竟pipe管道應該是在父程序開闢,且子程序要繼承它,如果在fork之後呼叫的話就是父子程序同時建立管道就會有兩個管道了

2.管道使用完畢後應該及時的關閉掉。

關閉的方式就是呼叫一次close(pipefd[x]);

3.pipe開闢的管道成為匿名管道,如果需要在非血緣關係間進行使用的話,需要使用有名管道。

貼乙個pipe的示例程式**:

#include #include #include int main(void)

pid = fork();

if(pid == -1)

if(pid == 0)

write(stdout_fileno,buf,ret);

}else

return 0;

}

程式語言 day 5

test 7 程式讀入一組文字行,並把最長的文字行列印出來 功能拆分,利用各個函式實現 while 還有未處理的行 if 該行比已處理的最長行還要長 儲存該行為最長行 儲存該行的長度 列印最長行 include define maxline 1000 限制每行可輸入的字元數量上限 int getli...

前端學習Day5

一.選擇符的權重 id class 標籤 四個數字表示權重 1.內聯樣式表 1000 2.id 100 3.class 10 4.標籤 1 5.偽類選擇符 10 6.萬用字元 0 7.包含選擇符的權重為權重之和 eg box div 權重 100 1 101 wrap con p 權重 10 10 ...

Linux 系統程式設計5 訊號

檢視linu下有哪些訊號 kill l 會用到訊號,比如你想結束掉乙個程序 ps aux 檢視程序 kill 結束程序 kill傳遞乙個訊號,訊號會導致程序終止 windows任務管理器也是一樣的道理,傳送乙個訊號,導致程序終止 man 7 signal linux中檢視訊號的機制ctrl c si...