免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 150159413
打印 上一主题 下一主题

[操作系统] telnet登陆目标板无法接收printf打印信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-29 17:51 |显示全部楼层 |倒序浏览
CPU : ARM9
BOARD : AT91RM9200

问题描述:
之前使用的是vxworks操作系统,串口和telnet连接目标板都可以接收到打印信息。因项目需求操作系统由vxworks替换为linux,
应用程序起来后,telnet到目标板接收不到printf的打印信息,但是串口可以正常接收。

个人猜测可能是默认输出到串口,因此telnet无法接管这些打印信息。

各位大侠有没有遇到这种情况,如何才可以再打印串口时,打印信息输出到串口,如果telnet连接到目标板,则输出telnet终端呢。
初学linux,多多赐教,多谢!

论坛徽章:
0
2 [报告]
发表于 2012-01-31 17:18 |显示全部楼层
回复 2# work4home

谢谢答复。


发现一点细节:
如果在文件系统起来后,telnet到目标板(此时是启动一个sh的,有一个PID,如果虚拟终端是/dev/pts/0),然后手动启动应用程序,应用程序的打印信息是可以接收到的。
但是关闭掉这次连接的终端后,再次telnet到目标板,就无法收到应用程序的打印信息,因为此时是又启动了一个sh,PID也跟上次的不一样了,最主要的是虚拟终端为/dev/pts/1。

意思就是不管你关闭多少次,再telnet到目标板,原来可以接收消息的虚拟终端/dev/pts/0一直分配不到,但是其他的终端,如/dev/pts/1就可以再次使用。

现在疑惑的是,这个打印信息是与首次分配的PID有关,还是与虚拟终端设备号有关。
也在考虑是不是与busybox里的telnet代码相关。也在考虑是不是需要在那里加重定向输出的代码或者脚本。

如果不能实现telnet接管打印信息的话,那么对于linux产品问题定位很不方便,100个产品的随机问题不可能找100个PC,使用100个串口都接上吧。

我也尝试了dmesg,但是只打印了内核启动的信息,应用程序的打印信息不存在。
谢谢work4home,还请多多交流。


   

论坛徽章:
0
3 [报告]
发表于 2012-02-01 10:16 |显示全部楼层
回复 4# work4home


首先谢谢work4home兄弟的交流。

根据work4home兄弟的说话,本人有个想法,应该是可以实现telnet接管打印信息,还请work4home给点意见。
这个打印信息的函数不能使用printf,应该自己实现一个打印函数,把输出信息重定向到新生成的虚拟终端pts上。当遍历终端时没有发现有虚拟终端,或者此终端退出时,需要重定向到console。

原本有想法,自己参考busybox代码实现telnet服务器,这个工作量还是比较大的,暂时放弃。另外监听socket连接,输出重定向到sock句柄,也不可行,无法区分其他类型的tcp连接。

因此起一个线程来做重定向的事,应该是易行的一个方法。只是目前还不知道有没有什么系统函数可以使用,目前想到一种笨的查找方法。先查找进程PID,再由进程PID去/proc/PID/fd 查找终端,再做重定向工作。

论坛徽章:
0
4 [报告]
发表于 2012-02-01 10:25 |显示全部楼层
work4home 发表于 2012-01-31 17:38
每次telnet上去,就会生成一个/dev/pts/x文件,每次都不会相同的;
你telnet上去后,会有一个/bin/sh,在这 ...



纠正work4home兄弟一句话。“每次telnet上去,就会生成一个/dev/pts/x文件,每次都不会相同的”
这个是可以相同的,不同的进程ID。请看下面:
# ps
  353 root      1696 R    -sh  -------这个是telnet的进程ID
  372 root      1684 R    ps
# ls /proc/353/fd -l
lrwx------    1 root     root           64 Jan  1 00:28 0 -> /dev/pts/0
lrwx------    1 root     root           64 Jan  1 00:29 1 -> /dev/pts/0
lrwx------    1 root     root           64 Jan  1 00:29 10 -> /dev/tty
lrwx------    1 root     root           64 Jan  1 00:29 2 -> /dev/pts/0
#
然后我关闭后,再次telnet到目标板:
# ps
  374 root      1692 S    -sh
  375 root      1684 R    ps
# ls /proc/374/fd -l
lrwx------    1 root     root           64 Jan  1 17:51 0 -> /dev/pts/0
lrwx------    1 root     root           64 Jan  1 17:51 1 -> /dev/pts/0
lrwx------    1 root     root           64 Jan  1 17:51 10 -> /dev/tty
lrwx------    1 root     root           64 Jan  1 17:51 2 -> /dev/pts/0
#

论坛徽章:
0
5 [报告]
发表于 2012-02-03 18:23 |显示全部楼层
这个问题已经解决了
需要写点代码就可以实现。
下次再贴方法,下班回家了

论坛徽章:
0
6 [报告]
发表于 2012-02-07 09:42 |显示全部楼层
需要在接管打印的进程内,做一个线程,目的是接收需要打印的虚拟设备。
比如现在是在/dev/console 打印信息的,此时我们telnet到目标板,tty看到设备名/dev/pst/0,我们需要把原来的打印信息console被pst/0接管。

主进程做一个服务端的代码,监听某个端口,当客户端有接入时,接收客户端消息,主要使用dup2来实现输出的重映射功能。

客户端代码主要是连接服务器,发送虚拟终端设备名。

思路就是这样了

论坛徽章:
0
7 [报告]
发表于 2012-03-12 11:38 |显示全部楼层
回复 10# killdog1982


    这个功能只能对一个进程起作用。进程能所有线程的打印都可以再telnet端口内打印出来,比较灵活

论坛徽章:
0
8 [报告]
发表于 2012-03-13 09:47 |显示全部楼层
回复 12# killdog1982


    用系统函数,dup2,把输出重定向到新的终端里
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP