欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Shell的管道與重定向怎么創(chuàng)建

本篇內(nèi)容主要講解“Shell的管道與重定向怎么創(chuàng)建”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Shell的管道與重定向怎么創(chuàng)建”吧!

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、錦江ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的錦江網(wǎng)站制作公司

對(duì)shell有一定了解的人都知道,管道和重定向是 Linux 中非常實(shí)用的 IPC 機(jī)制。

在shell中,我們通常使用符合&lsquo;|&rsquo;來(lái)表示管道,符號(hào)&lsquo;>&rsquo;和&lsquo;<&rsquo;表示重定向。

那么管道和重定向的真實(shí)含義(定義)又是什么呢?

管道

管道的定義

管道就是一個(gè)進(jìn)程與另一個(gè)進(jìn)程之間通信的通道,它通常是用作把一個(gè)進(jìn)程的輸出通過(guò)管道連接到另一個(gè)進(jìn)程的輸入。

它是半雙工運(yùn)作的,想要同時(shí)雙向傳輸需要使用兩個(gè)管道。

管道又可以分為匿名管道和命名管道,而shell中使用到的是匿名管道,所以本文僅描述匿名管道。

例如命令ls | grep main.c,使用了管道來(lái)連接了兩條命令來(lái)執(zhí)行,能夠快速地讓我們知道當(dāng)前目錄下是否有 main.c 文件。

管道的本質(zhì)是內(nèi)存中的緩沖區(qū),可以看作是打開(kāi)到內(nèi)存中的文件。

所以需要使用兩個(gè)文件描述符來(lái)索引它,一個(gè)表示讀端,一個(gè)表示寫端。

并且規(guī)定,數(shù)據(jù)只能從讀端讀取、只能往寫端寫入。

創(chuàng)建管道

使用函數(shù)pipe()可以創(chuàng)建匿名管道,需要包含頭文件 unistd.h,示例代碼:

int fd[2];  pipe(fd);

首先創(chuàng)建一個(gè) 2 個(gè)元素的整型數(shù)組,然后將該數(shù)組作為pipe()的參數(shù),pipe()執(zhí)行成功后,數(shù)組元素 fd[0]的值就會(huì)變成所創(chuàng)建的管道的讀端的文件描述符,fd[1]就會(huì)變成寫端的文件描述符。

至此管道就算創(chuàng)建成功了。

把管道作為標(biāo)準(zhǔn)輸入輸出

管道創(chuàng)建成功后,就可以直接使用 read()和 write()函數(shù)對(duì)管道進(jìn)行數(shù)據(jù)的讀寫。

而因?yàn)閟hell中都是使用標(biāo)準(zhǔn)輸入輸出對(duì)管道進(jìn)行讀寫的,例如ls | grep main.c就是將 ls 的標(biāo)準(zhǔn)輸出寫到了管道寫端,而 grep 的標(biāo)準(zhǔn)輸入則從管道讀端讀取,所以本文也只描述此方法。

示例代碼如下:

int fd[2];  pipe(fd);  pid=fork();  if(0==pid) //execute next command in child process  {   dup2(fd[0],0);//redirect standard input to pipe(read)   close(fd[0]);   close(fd[1]);   if(0!=execvp(cmd0[0],cmd0))    printf("No such command!\n");   exit(EXIT_SUCCESS);  }  else //execute current command in current process   {   dup2(fd[1],1);//redirect standard output to pipe(write)   close(fd[0]);   close(fd[1]);   if(0!=execvp(cmd1[0],cmd1))    printf("No such command!\n");   exit(EXIT_SUCCESS);  }
  •  首先是創(chuàng)建一個(gè)管道,然后創(chuàng)建子進(jìn)程,子進(jìn)程會(huì)繼承這一個(gè)管道,也就保證了父進(jìn)程與子進(jìn)程操作的是同一個(gè)管道(管道的繼承與普通變量不同)。

  •  如果我們希望在子進(jìn)程中執(zhí)行管道的讀端的程序例如ls | grep main.c中的grep main.c;在父進(jìn)程中執(zhí)行管道的寫端的程序,例如ls | grep main.c中的ls。

  •  在子進(jìn)程中,先調(diào)用dup2(fd[0],0);此函數(shù)就是將標(biāo)準(zhǔn)輸入的文件描述符 0,指向了管道的讀端。

文件描述符,本質(zhì)是非負(fù)整數(shù),通常是小整數(shù);它是一個(gè)索引,通過(guò)該索引可以找到對(duì)應(yīng)的文件。

例如,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤的文件描述符默認(rèn)是 0、1、2 。當(dāng)進(jìn)程需要從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)時(shí),就會(huì)通過(guò) 0 索引找到標(biāo)準(zhǔn)輸入所對(duì)應(yīng)的內(nèi)存緩沖區(qū)來(lái)讀取數(shù)據(jù)。

  •  假設(shè)此時(shí)管道讀端的文件描述符為 3、寫端文件描述符為 4 。

  •  調(diào)用dup2(fd[0],0),實(shí)際上就是將文件描述符 3 指向的文件表項(xiàng)賦值給了文件描述符 0,而文件描述符 0 正是進(jìn)程默認(rèn)的標(biāo)準(zhǔn)輸入。

  •  所以此時(shí),當(dāng)進(jìn)程需要從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)時(shí),進(jìn)程就會(huì)通過(guò)文件描述符 0 來(lái)找到管道讀端所對(duì)應(yīng)內(nèi)存緩沖區(qū)。

  •  從而實(shí)現(xiàn)了通過(guò)標(biāo)準(zhǔn)輸入來(lái)讀取管道的數(shù)據(jù),也可以說(shuō)是,將管道的讀端重定向到了標(biāo)準(zhǔn)輸入。管道的寫端與標(biāo)準(zhǔn)輸入的關(guān)系也與此類似,此處不再贅述。

Shell的管道與重定向怎么創(chuàng)建

  •  調(diào)用dup2(fd[0],0)之后還需要調(diào)用close()函數(shù)將管道原有的文件描述符關(guān)閉,關(guān)閉的意思是文件描述符 3 和 4 不再索引到管道或者其他文件,也就是說(shuō)此時(shí)使用 read 函數(shù)從文件描述符 3 中是讀取不到管道的數(shù)據(jù)的了,并不是說(shuō)關(guān)閉管道的意思。

  •  完成管道的設(shè)置之后,就可以通過(guò) exec 族函數(shù)來(lái)執(zhí)行外部命令了。

需要注意的是,調(diào)用 exec 族函數(shù)并不會(huì)把管道這種 IPC 資源覆蓋或者重新初始化。文件重定向

文件重定向

其實(shí)與上面管道重定向到標(biāo)準(zhǔn)輸入輸出很類似,甚至可以直接采用上面所說(shuō)的方法來(lái)實(shí)現(xiàn)。但是此處將講述一種更加簡(jiǎn)潔的方法實(shí)現(xiàn)。

實(shí)例代碼如下:

char fileName[20]="out.txt";  freopen(fileName,"w",stdout);//redirect stdout to fileName

以上兩行簡(jiǎn)單的代碼就實(shí)現(xiàn)了,將該進(jìn)程的標(biāo)準(zhǔn)輸出重定向到了文件 out.txt ,甚至一行就可以實(shí)現(xiàn)。

執(zhí)行以上代碼后,當(dāng)前進(jìn)程的所有標(biāo)準(zhǔn)輸出,也就是 printf()之類的輸出全都會(huì)被寫到文件 out.txt,顯示屏將不會(huì)有輸出。

而將進(jìn)程的標(biāo)準(zhǔn)輸入重定向到文件 in.txt 的代碼如下:

char fileName[20]="in.txt";  freopen(fileName,"r",stdin);//redirect stdin to fileName

Shell的管道與重定向怎么創(chuàng)建

其中的核心函數(shù)就是freopen():

Shell的管道與重定向怎么創(chuàng)建

到此,相信大家對(duì)“Shell的管道與重定向怎么創(chuàng)建”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁(yè)題目:Shell的管道與重定向怎么創(chuàng)建
文章地址:http://aaarwkj.com/article36/iggosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站策劃定制網(wǎng)站、用戶體驗(yàn)、搜索引擎優(yōu)化服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)
日韩欧美精品在线不卡| 欧美日韩一区二区激情在线| 亚洲天堂免费观看av| av剧情在线观看免费| 日韩免费毛片在线观看| 国产自拍最新在线视频| 成人性生交大片免费看多人| 午夜在线成人免费观看| 亚洲熟妇av一区二区| 精品人妻一区二区三区蜜桃视频| 久久亚洲精品综合一区| 国产av毛片一区二区| 日本在线精品在线观看| 国模一区二区三区视频| 欧美日韩台湾一区二区| 亚洲精品乱码在线播放| 国产精品日本欧美久久久| 国产欧美日韩精品国产| 亚洲综合国产一二三四五区| 宅男午夜一区二区三区| av剧情免费在线观看| 日本亚洲中文字幕网站| 伊人久久亚洲福利精品| 亚洲一区二区三区国色天香| 欧美亚洲另类日韩综合网| 亚洲五月综合激情综合久久| 青草成人在线视频观看| 午夜激情在线观看网页| 日韩在线中文字幕三区| 天天操夜夜夜夜夜操| 丝袜美腿一区二区三区| 亚洲日本久久久午夜精品| 久久青草视频在线观看 | 国产网红女主播视频一区二区| 91黄色国产在线播放| 日韩高清不卡在线视频| 欧美av在线免费观看| 国产精品99久久久久久宅男九| 国产一级成人免费视频| 中文字幕国产成人在线视频| 青青草国产精品一区二区|