免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
在linux上 重定向 管道實現(xiàn) (轉(zhuǎn))

管道和重定向

輸入輸出不僅可以重定向到文件,也可以通過管道傳遞到其他進程中。

基本思路:

linux:

1. 創(chuàng)建管道對

pipe(int pipefd[2])

2. 創(chuàng)建進程

首先fork,然后子進程用dup2把pipefd[0]復(fù)制到STDIN_FILENO(就是0),然后關(guān)閉pipefd[1],或者把pipefd[1]復(fù)制到STDOUT_FILENO(就是1),然后關(guān)閉pipefd[0]。

之后調(diào)用exec去載入要創(chuàng)建的進程。

3. 讀或?qū)?/p>

用read或者write。注意讀寫之前要把子進程使用的那一個用close函數(shù)關(guān)閉掉。

區(qū)別在*nix創(chuàng)建進程分兩步,fork然后exec。windows只一步。

區(qū)別2,*nix要手工dup來復(fù)制文件描述符,windows在創(chuàng)建進程的API內(nèi)部做好了這件事。

linux步驟多一些,但是靈活,可以變化出多種模式來,例如fork之后,不僅僅子進程可以exec,父進程也可以exec,完完全全實現(xiàn)像“l(fā)s|wc -l”這樣的功能。也就是子進程用wc去替代,父進程用ls去替代。

windows步驟少,模式固定,它要實現(xiàn)上述功能,反而更加繁瑣,需要創(chuàng)建兩個進程,并把它們對接,然后等待兩個進程結(jié)束

實例:

題目:通過管道模擬shell命令:catfile | sort

涉及主要知識點:未命名管道、重定向

題目描述:具體模擬一個shell命令:cat file | sort。具體的一些提示在后面。

提示:首先在當前目錄下創(chuàng)建一個名為”file”的文件,里面的內(nèi)容輸入如下:

99

123

892

12

1342

89

32

76

通過執(zhí)行”cat file | sort”后的結(jié)果如下:

12

123

1342

32

76

89

892

99

現(xiàn)在我們需要通過一個管道,將”cat file”的結(jié)果通過管道送給命令”sort”。其中,將”cat file”命令的輸出結(jié)果重定向到”sort”命令的輸入是由包含在命令中的管道標志”|”來完成的。為了在程序當中實現(xiàn)類似的功能,需要用dup()或者dup2()系統(tǒng)調(diào)用將標準輸入和標準輸出聯(lián)系起來,具體的系統(tǒng)調(diào)用使用可以通過man手冊來查,或者查閱群共享里面的函數(shù)手冊。另外,這里的”cat file”和”sort”命令不是自己來完成,而是通過調(diào)用exec函數(shù)族來實現(xiàn)的。

******************************************************************************************************************************************

******************************************************************************************************************************************

我的源代碼如下:

  

  1. 1 #include <stdio.h>  
  2.   2 #include<stdlib.h>  
  3.   3 #include<string.h>  
  4.   4 #include<unistd.h>  
  5.   5 #include<sys/types.h>  
  6.   6 #include<sys/stat.h>  
  7.   7  
  8.   8 int main(intarg,char *argv[],char **environ)  
  9.   9 {  
  10.  10     int fd[2];  
  11.  11     pid_t pid;  
  12.  12     int stat_val;  
  13.  13  
  14.  14     if(arg < 2)  
  15.  15     {  
  16.  16         printf("wrong parameters\n");  
  17.  17         exit(0);  
  18.  18     }  
  19.  19     if(pipe(fd))  
  20.  20     {  
  21.  21         printf("Create pipefailed!\n");  
  22.  22         exit(1);  
  23.  23     }  
  24.  24  
  25.  25     pid=fork();  
  26.  26     switch(pid)  
  27.  27     {  
  28.  28         case -1:  
  29.  29             perror("forkfailed!\n");  
  30.  30             exit(1);  
  31.  31         case 0:  
  32.  32             //close(0);  
  33.  33             //dup(fd[0]);  
  34.  34             dup2(fd[1],1);  
  35.  35             close(fd[0]);  
  36.  36             execlp("cat","cat","file",NULL);  
  37.  37             exit(0);  
  38.  38         default:  
  39.  39             dup2(fd[0],0);  
  40.  40             close(fd[1]);  
  41.  41             execlp("sort","sort",NULL);  
  42.  42             exit(0);  
  43.  43     }  
  44.  44     wait(&stat_val);  
  45.  45     exit(0);  
  46.  46     return 0;  
  47.  47 }  
  48. ******************************************************************************************************************************************  
  49. ******************************************************************************************************************************************  
  50. 編譯sort.c:  
  51. jingjing@jingjing-laptop:~/公共的$ gccsort.c -o sort  
  52.    
  53. 運行程序:  
  54. jingjing@jingjing-laptop:~/公共的$ ./sortcat file|sort  
  55. 12  
  56. 123  
  57. 1342  
  58. 32  
  59. 76  
  60. 89  
  61. 892  
  62. 99  
  63. *****  

流程圖:

1』pipe()創(chuàng)建管道、fork()創(chuàng)建子進程

這里,0-1-2分別表示標準輸入,標準輸出,標準錯誤。先創(chuàng)建管道,再由fork創(chuàng)建子進程,這里子進程是完全繼承父進程的文件描述符表。
 
『2』父進程和子進程分別執(zhí)行dup2()

重定向以后,父進程的標準輸入來自管道,子進程的標準輸出到管道。也就是將父進程的文件描述符[3]處的指針拷貝到[0]對應(yīng)的條目處;將子進程的文件描述符4處的指針拷貝到[1]對應(yīng)的條目處。
 
『3』各自調(diào)用close以后

調(diào)用close()關(guān)閉文件描述符,相當于刪除文件描述符表的對應(yīng)條目。
這里,close(fd[0])和close(fd[1])的操作是不可以省略的:執(zhí)行了2個 close以后,參見圖4,只有子進程的ls -l才會像管道寫數(shù)據(jù),最終子進程終止,父進程會檢測到文件結(jié)束;否則如果省略到close(),按照圖3所示,子進程終止以后,父進程的文件描述符[4]仍然是為管道的寫操作打開著,父進程將陷入無限期的阻塞,等待數(shù)據(jù)的寫入。

 注意: 關(guān)于這里 在父、子進程中都需要 close() 兩次 有待驗證!

心得:

原文:http://blog.csdn.net/markman101/article/details/7304979

1

子進程的功能是讀出信息,而父進程的功能是寫入信息;因此在子進程那里,要把管道的輸入端復(fù)制到標準輸出中,即dup2(fd[1],1)而父進程則要把管道寫端復(fù)制到標準輸入,即dup2(fd[0],0)。

 

2

dup()與dup2()的最大區(qū)別:

舉例說明:

                    close(1);         //關(guān)閉標準輸出

                    dup(fd[1]);     //把管道的輸入端復(fù)制到標準輸出

                    這兩個語句等價于:  dup2(fd[1],1);

所以dup2()是把close()和dup()這兩個函數(shù)集成在了同一個函數(shù)里。這里特別要注意的是:dup2()的兩個參數(shù),是把前一個復(fù)制到后一個里面,所以書上的例子中寫的是錯誤的。

3、還有就是exec()函數(shù)的用法,我一開始不知道“cat file“命令如何作為函數(shù)的參數(shù),現(xiàn)在談?wù)勎业睦斫獍桑?/p>

我的程序中execlp("cat","cat","file",NULL);第一個參數(shù)是為了指明該命令的路徑,第二個和第三個參數(shù)是該命令

所包含的所有參數(shù),即把他們一一羅列出來。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
dup和dup2函數(shù)
Shell:管道與重定向
自己實現(xiàn)popen函數(shù)
Linux的進程通訊之匿名管道
OS Lab 1.3 pingpong (easy)
dup & dup2
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服