1、每个进程的输入输出导向目标都可以在进程号下的fd软链接上查看。如
569号进程的输出目标是/dev/console,即串口。其中0是标准输入,1是标准输出,2是标准错误输出。
2、因此我们只需要查看telnet进程,fd的0,1,2号软链接的情况即可。
从图中可以看出,内容输出直接导向到/dev/null,即全部抛弃。
3、那么问题来了,如何将进程的输出给导向到telnet界面呢?
3.1、每增加一路telnet连接,系统就会在/dev/pts目录下创建设备节点。
3.2、因此只需要把进程的fd 0,1,2软链接到对应telnet的节点下,如/dev/pts/0
4、代码实现
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
int main(int argc, char *argv[])
{
int tty = -1;
char *tty_name = NULL;
if(argc < 2)
{
printf("miss argument\n");
return 0;
}
/* 获取当前tty名称 */
tty_name = ttyname(STDOUT_FILENO);
printf("tty_name: %s\n", tty_name);
if(!strcmp(argv[1], "on"))
{
/* 重定向console到当前tty */
tty = open(tty_name, O_RDONLY | O_WRONLY);
ioctl(tty, TIOCCONS);
perror("ioctl TIOCCONS");
}
else if(!strcmp(argv[1], "off"))
{
/* 恢复console */
tty = open("/dev/console", O_RDONLY | O_WRONLY);
ioctl(tty, TIOCCONS);
perror("ioctl TIOCCONS");
}
else
{
printf("error argument\n");
return 0;
}
close(tty);
return 0;
}