在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的打开。

 

 

Logo

更多推荐