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)..
在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的打开。
更多推荐
所有评论(0)