1. 程式人生 > >linux中將printf重定向到telnet的方法和總結

linux中將printf重定向到telnet的方法和總結

在linuxc開發過程中肯定會遇到重定向的問題,重定向最多的就是printf,下面給出重定向的程式碼和需要注意的問題。

void telnetCtlPrintf(int index)

{

int fd;

char tempPath[64];

memset(tempPath,0,sizeof(tempPath));

sprintf(tempPath,"/dev/pts/%d",index);

/*

sprintf(tempPath,"/dev/console",index);

這一段是用來重定向到串列埠的,就是再從Telnet重定向到console;

*/

if((fd = open(tempPath, O_RDONLY | O_WRONLY)) < 0)

{

    printf("open file failed\r\n");

    return ;

}

dup2(fd,STD_OUT);

close(fd);

}

上述程式碼就是將printf重定向到telnet的程式碼。

1.如果多個程序的printf需要定向到一個telnet的haul那麼即使你這樣操作了也不行。為什麼呢?

原因是:linux中每個程序都有自己的堆疊,那麼對於所有的檔案描述符啊,socket啊。。。。這些fd都是隻在本身的程序起作用的,當我們用上面的程式碼進行操作的話那麼,你開啟的fd是當前printf在的程序的重定向這樣的重定向只會講當前程序的printf的定向到當前telnet,而其他的程序的printf則不會定向到telnet。

2.對於telnet,這裡的telnet的fd的建立是採用的虛擬終端的概念,即使用的是openpty函式生成的一個fd。所以在使用過程中可以在路徑/dev/pts/下可以看到0,1,2。這些都是裝置的識別符號。

3.重定向在一個程序中倒是無所謂,關鍵是多程序的時候涉及到的程序間的重定向的問題,這些問題要注意的是fd,切記在linux一個程序的fd只會在自己程序中發揮作用,當你用其他方法傳送過去的只不過是個int值而已並無實際意義。

4.dup2後的fd是可以關閉的為啥呢,由於已經把輸出告訴了系統,你要輸出到telnet所以系統已經知道了,那麼就無需再保持著fd的開啟。