管道實現父子進程的信息傳遞(一)【fork函數、pipe函數、write/read操作、wait函數】

文章目錄

  • 題目描述
  • 代碼實現
  • 關于pipe函數
  • 關于讀寫操作
  • 關于讀寫端口
  • 關于wait函數
    • 功能:
    • 注意:
  • 關于fork函數


題目描述

編寫一個程序,利用管道實現父子進程的通信,父進程向子進程發送信息,由子進程輸出顯示。

代碼實現

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  //管道功能所在的頭文件
#include <sys/types.h>  //wait函數所在的頭文件
#include <sys/wait.h>  //wait函數所在的頭文件#define MAXLINE 80int main()
{int n;  //所發送消息的長度int fd[2];  //管道讀寫端口pid_t pid;  //進程號char line[MAXLINE];  //消息緩沖區if(pipe(fd) < 0) //建立管道不成功{perror("pipe");exit(1); //有錯誤型的退出}if((pid = fork()) < 0) //建立子進程不成功{perror("fork:");exit(1);}else  //成功建立子進程{	if(pid > 0)  //父進程{close(fd[0]);  //關閉讀端write(fd[1],"I love CMY!\n", 12);  //把"I love CMY!\n"長度為12的字符送到管道寫端口fd[1]close(fd[1]);   //關閉寫端,老師是要求寫完之后要關閉的,但是我試了試不寫也沒啥問題……wait(NULL);  //父進程等待子進程結束}else  //子進程{close(fd[1]);  //關閉寫端n = read(fd[0], line, MAXLINE);  //從管道讀端口fd[0]把長度為MAXLINE的字符送到line中write(STDOUT_FILENO, line, n);  //將line中長度為n的字符寫到標準輸出設備(即屏幕上)close(fd[0]);  //同上,關閉讀端,老師是要求寫完之后要關閉的,但是我試了試不寫也沒啥問題……}	}return 0;
}

關于pipe函數

功能:創建一個普通管道
在這里插入圖片描述


關于讀寫操作

在這里插入圖片描述

也就是說讀/寫操作的流程是:

  • 關閉讀/寫端
  • 進行寫/讀操作
  • 寫/讀完關閉寫/讀端

關于讀寫端口

為什么fd[0]是讀,fd[1]是寫,能不能顛倒過來?

一般來講,我們常說:讀寫讀寫,不說寫讀寫讀,因為不順口。所以0是讀,1是寫,你要是想顛倒也是可以的,只要你自己記得住就行。


關于wait函數

在這里插入圖片描述
在這里插入圖片描述

功能:

父進程一旦調用了wait就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成僵尸的子進程,wait就會收集這個子進程的信息,并把它徹底銷毀后返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這里,直到有一個出現為止。

注意:

當父進程沒有用wait()函數等待已終止的子進程時,子進程就會進入一種無父進程的狀態,此時子進程就是僵尸進程。
如果先終止父進程,子進程依然會繼續正常進行,只是它將由init進程(PID 1)繼承,當子進程終止時,init進程捕獲這個狀態。


關于fork函數

其實本題就是管道和父子進程的相結合,重點是理解fork()之后父子進程的并行執行,以老師PPT中的例題為例:在這里插入圖片描述
在這里插入圖片描述

子進程執行的是 val == 0 的內容,而父進程執行的是 val > 0 的內容,子進程創建的時候完全復制了父進程的資源,可以理解為自 val = fork() 之后,代碼就被copy了一份一摸一樣的,父進程執行被copy的,子進程執行copy的。而對于本題而言,從

if((pid = fork()) < 0) //建立子進程不成功

開始,子進程copy了后面的代碼,而且繼承了父進程之前的資源,如變量等,然后在接下來的代碼中根據pid的不同進入不同的代碼段。

值得注意的是,本題代碼中先處理的是父進程的寫操作,再處理的是子進程的讀操作,那如果反過來先寫子進程的讀操作,再寫父進程的寫操作,代碼還可以正常運行嗎?

經過測試,答案是可以,因為我們剛講過他們倆是并行執行嘛,但是根據先寫進去再讀出來比較符合人類的思維,所以我們本題就先寫父進程的寫操作,再處理子進程的讀操作~

證據如下圖:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基礎的shell編程問題(一)

文章目錄題目一題目描述代碼實現關于$#的有關內容實測本程序的作用題目二題目描述代碼實現注釋關于argc、argv關于read函數關于文件描述符關于write函數本程序的作用題目三題目描述代碼實現實測關于grep命令關于read命令題目四題目描述代碼實現關于test命令實測題目一 題目描述…

百戰c++(9)

12 . 下面的代碼輸出是什么&#xff0c;為什么&#xff1f; void foo(void) { unsigned int a 6; int b -20; (ab > 6) puts("> 6") : puts("< 6"); } 這個問題測試你是否懂得C語言中的整數自動轉換原則&#xff0c;我發現有些開發者懂得…

基礎的shell編程問題(二)

文章目錄題目一題目描述代碼實現結果驗證關于本題題目二題目描述代碼實現結果測試題目三題目描述代碼實現及結果測試題目四題目描述代碼實現及結果測試題目五題目描述代碼實現及結果測試題目一 題目描述 輸入的命令行參數必須是hello&#xff0c;才會正確顯示&#xff1b;否則…

百戰c++(10)

1.多態類中的虛函數表是Compile-Time&#xff0c;還是Run-Time時建立的? 2.將一個 1M -10M 的文件&#xff0c;逆序存儲到另一個文件&#xff0c;就是前一個文件的最后一個 字符存到新文件的第一個字符&#xff0c;以此類推。 3.main主函數執行完畢后&#xff0c;是否可能會…

Numpy實現酒鬼漫步問題【以及randint()、where()、cumsum()、argmax()的用法詳解】

文章目錄題目描述代碼實現關于本題涉及到的幾個函數randint()where()cumsum()題目拓展題目描述代碼實現題目拓展題目描述代碼實現argmax()題目描述 從前有一個酒鬼&#xff0c;喝醉了行走在一條直線上&#xff0c;每走一步方向是不確定的&#xff08;向前或者向后&#xff09;…

百戰c++(11)

31.找錯 Void test1() { char string[10]; char* str1"0123456789"; strcpy(string, str1); } Void test2() { char string[10], str1[10]; for(I0; I<10;I) { str1[i] a; } strcpy(string, str1); } Void test3(char* str1) { char string[10]; if(st…

搞清axis的含義,這一篇就夠了!

文章目錄axis的含義旁門左道式理解二維數組中的axis三維數組中的axis正規理解axis的含義 在自己分析之前先擺上官方關于多維數組中axis的值的定義&#xff1a; axis 0&#xff0c;表示第一個維度 axis 1&#xff0c;表示第二個維度 axis -1&#xff0c;表示最后一個維度…

百戰c++(12)

36. 定義 int **a[3][4], 則變量占有的內存空間為&#xff1a;_____ 37. 編寫一個函數&#xff0c;要求輸入年月日時分秒&#xff0c;輸出該年月日時分秒的下一秒。如輸入2004年12月31日23時59分59秒&#xff0c;則輸出2005年1月1日0時0分0秒。 38.寫一個函數&#xff0c;判…

Struts2.3.5+Hibernate3+Spring3.1基于注解實現的多文件上傳,下載

Struts2.3.5Hibernate3Spring3.1基于注解實現的的多文件上傳&#xff0c;下載,這里是上傳文件到數據庫中&#xff0c;上傳控件可以增加和刪除&#xff0c;有需要的朋友可以看看。 以下是源碼下載地址&#xff1a;http://www.zuidaima.com/share/1639672872438784.htm jar包的下…

Pandas索引操作及高級索引——reindex()方法

文章目錄索引對象多個數據結構之間共享index類對象is與的區別重置索引——reindex()索引操作Series的索引操作切片不連續索引布爾型索引DataFrame的索引操作獲取不連續的Series對象切片Pandas庫中的操作索引方法索引對象 Index類對象&#xff0c;該對象不可以進行修改&#xf…

【精品計劃1】動態規劃入門到熟悉,看不懂來打我啊

持續更新。。。。。。 2.1斐波那契系列問題 2.2矩陣系列問題 2.3跳躍系列問題 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些變形選講 2.1斐波那契系列問題 在數學上&#xff0c;斐波納契數列以如下被以遞歸的方法定義&#xff1a;F(0)0&#xff0c;F(1)1, F(n)F(n-1)…

Pandas數據排序——【按索引排序sort_index()方法、按值排序sort_value()方法】

文章目錄按索引排序——sort_index()對Series排序對DataFrame排序按值排序——sort_value()對Series進行排序對DataFrame進行排序按索引排序——sort_index() sort_index(axis0, levelNone, ascendingTrue, inplaceFalse, kind‘quicksort’, na_position‘last’,sort_remaini…

【大總結2】大學兩年,寫了這篇幾十萬字的干貨總結

本文是我大學兩年知識的總結。涵蓋數據結構、算法、語言基礎、操作系統、關系數據庫、NOSQL、網絡/前端/項目基礎知識、安全和測試、框架的學習、中間件和工具、設計模式和框架原理、我推薦的資料、我的建議 本篇文章應該算是Java后端開發技術棧的&#xff0c;但是大部分是基礎…

Pandas對象的層次化索引——【from_tuples()、from_arrays()、from_product()、swaplevel()、sort_index()、sort_values()】

文章目錄層次化索引的概念層次化索引的創建使用嵌套列表的方式構造層次化索引對象Series對象DataFrame對象通過MultiIndex類的方法構建層次化索引通過from_tuples()方法創建MultiIndex對象通過from_arrays()方法創建MultiIndex對象通過from_product()方法創建MultiIndex對象層次…

《這是全網最硬核redis總結,誰贊成,誰反對?》六萬字大合集

我攤牌了&#xff0c;這篇文章&#xff0c;值得99%的人收藏 此文后續會改為粉絲可見&#xff0c;所以喜歡的請提前關注和收藏&#xff0c;不迷路。 最近有五本我喜歡的redis實體新書&#xff0c;想要的去評論&#xff0c;我寫個隨機數抽獎包郵送給你。 那么&#xff0c;準備好…

Python數據預處理之異常值的處理——【自定義的three_sigma()函數、boxplot()方法】

文章目錄基于3σ原則檢測異常值代碼實現測試基于箱型圖檢測異常值異常值的處理基于3σ原則檢測異常值 3σ原則&#xff0c;又稱拉依達準則。是指假設一組檢測數據只含有隨機誤差。對其進行計算處理得到標準偏差&#xff0c;按一定概率確定一個區間&#xff0c;凡是超過這個區間…

那個谷歌的網紅扔雞蛋的題,來看看教科書式的回答

leetcode頂級難題&#xff0c;谷歌面試天天問&#xff0c;來看看吧&#xff0c;帶你來一步一步達到最優解。 谷歌不知道問了多少遍&#xff0c;藍橋杯也出現過&#xff0c;leetcode上是頂級難題&#xff0c;到底是什么題能如此頻繁地出現&#xff1f;我們一探究竟吧。 原題描述…

Python更改數據類型——astype()方法和to_numeric()函數

文章目錄明確指定數據的類型通過dtypes屬性進行查看創建Pandas對象指定數據類型轉換數據類型通過astype()方法強制轉換數據的類型通過to_numeric()函數轉換數據類型明確指定數據的類型 通過dtypes屬性進行查看 import pandas as pddf pd.DataFrame({A: [1, 2, 4],B: [9, -80…

不騙你,沒讀這一篇,你不可能懂二分

上篇文章講動態規劃獲得了80k瀏覽&#xff0c;這次的二分也值得你們一看&#xff0c;這個系列是特別用心寫的&#xff0c;準備出書的哦 動態規劃 3.0 引子 圖書館自習的時候,一女生背著一堆書進閱覽室,結果警報響了,大媽讓女生看是哪本書把警報弄響了&#xff0c;女生把書倒出…

Python之數據合并——【concat()函數、merge()函數、join()方法、combine_first()方法】

文章目錄軸向堆疊數據——concat()函數橫向堆疊與外連接縱向堆疊與內連接主鍵合并數據——merge()函數內連接方式外連接方式左連接方式右連接方式其他根據行索引合并數據——join()方法四種連接方式行索引與列索引重疊合并重疊數據——combine_first()方法軸向堆疊數據——conc…