I O重定向和管道

2021-06-28 11:16:09 字數 2790 閱讀 5763

輸入輸出重定向和管道是程序間的一種特殊方式。

unix程序使用標準的檔案描述符,0(stdin)、1(stdout)、2(stderr),當程序請求乙個新的檔案描述符的時候,系統核心將最低可用的檔案描述符給它。通常情況下這三個檔案描述符是開啟著的。

一、i/o重定向

在linux中,我們通過shell與系統互動,本質上就是建立程序,在程序中執行操作。 一般的輸入是stdin,標準輸入鍵盤。輸出為終端介面。可以利用重定向將標準輸入或輸出設為傳統意義檔案(因為在linux下一切皆為檔案)

關於檔案描述符:unix程序使用檔案描述符0、1、2作為標準輸入、輸出和錯誤的通道。其次,當程序請求乙個新的檔案描述符的時候,系統核心將

最低可用

的檔案描述符給它。

i/o重定向用到的函式有dup和dup2()

函式原型:

#include

newfd = dup(oldfd);

或newfd = dup2(oldfd,newfd); //一般來將先關閉掉newfd,然後複製oldfd都newfd位置

常用操作

二、管道

原型: 

管道可以應用於程序中,通過子程序寫,父程序讀

#include#include int main()

三、fdopen和popen使用

fdopen使得對遠端的程序的處理就像處理常規檔案一樣。popen函式,通過封裝pipe、fork、dup、exex等系統呼叫使得對程式和檔案的操作手法一樣。

下面以一下簡易計算器示例說明fdopen使用,結合了管道

#include #include #define oops(x,m)	

void be_dc(int in[2],int out[2]);

void be_bc(int todc,int fromdc);

void fatal(char*);

int main()

}void be_dc(int in[2],int out[2])

/* *set up stdin and stdout,then execl dc

*/close(in[0]);

close(in[1]); /*won't use*/

if (dup(out[1],1) == -1)

close(out[1]);

close(out[0]);/*won't use*/

if(execlp("dc","dc","-",null) == -1)

oops("can not run dc\n",3);

}void be_bc(int todc[2],int fromdc[2])

if(fprintf(fpout,"%d\n%d\n%c\np\n",num1,num2,*operation) == eof)

fflush(fpout);

if(fgets(message,bufsiz,fpin) == null)

break;

printf("%d %s %d = %s",num1,operation,num2,message);

} fclose(todc[1]);

fclose(fromdc[0]);

}void fatal(char* mess)

popen使用

file* fp;

fp = popen("ls","r");

fgets(buf,len,fp);

pclose(fp);

示例:#include #include int main()

管道和I O重定向

i o重定向 i o redirection 0標準輸入 1標準輸出 2標準錯誤 輸出重定向 覆蓋,追加 root localhost date 1 date.txt root localhost date date.txt root localhost ls home aaaaaaaaa list...

I O重定向和管道

i o重定向 是將預設輸出 輸出和錯誤對應的裝置改變,指向新的目標 linux給程式提供三種i o裝置 標準輸入 stdin 0 預設接受來自終端視窗的輸入 標準輸出 stdout 1 預設輸出到終端視窗 標準錯誤 stderr 2 預設輸出到終端視窗 標準輸出和錯誤重定向 重定向到檔案比如 ech...

I O重定向和管道

當程式ps不顯示路徑可使用檢視編號的方式查詢真實路徑 進入相應編號檔案用ll檢視即可看到口令對應的路徑 shell也屬於乙個程式,每個shell視窗都對應乙個編號 echo 檢視當前所在shell的編號 ll proc fd fd 裝置 ll dev st 預設情況下最後對應的都是終端視窗 重定向 ...