輸入輸出重定向和管道是程序間的一種特殊方式。
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 預設情況下最後對應的都是終端視窗 重定向 ...