免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3685 | 回复: 6
打印 上一主题 下一主题

一个进程可以同时向两个终端窗口输出(printf)字符吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-11 13:34 |只看该作者 |倒序浏览
请教:一个进程可以同时向两个终端窗口输出(printf)字符吗?

正常是一个进程可以向1个终端窗口(stdout,也就是运行它的终端)输出(printf)字符,
我的程序已经使用curse.h来定位输出一系列状态信息了,现在新要求再能滚动地输出流水信息
如果还在那个窗口输出,肯定要冲乱本来定位得较好的状态信息了

如何让它输出到另一个终端窗口?

现在有2个办法,但是都嫌:需要再编一个程序而且增加复杂度和难度:
1、另一个进程通过消息队列得到需要输出的信息,在自己的终端窗口予以输出
2、另一个进程通过socket通讯得到需要输出的信息,在自己的终端窗口予以输出


可否程序向stderr滚动输出,然后通过什么命令行参数使得它的stderr输出到另一个终端?

或者:

fd=fopen("/dev/tty0a",O_RDWR);
程序用这个方法新建一个控制台,再往它(文件句柄)上面输出也不行吗?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-01-12 10:48 |只看该作者

一个进程可以同时向两个终端窗口输出(printf)字符吗?

只要将流水信息用附加方式不断地写到一个log文件的末尾,需要实时监视时只要在另一终端键入:
tail -f yourfile.log
即可。
不需监视时,键入ctrl-C杀死tail进程就可以了。

论坛徽章:
0
3 [报告]
发表于 2005-01-12 10:53 |只看该作者

一个进程可以同时向两个终端窗口输出(printf)字符吗?

用 command 2>/dev/pts/tib 不行么(其中pts/tib是举例子,who 出来的)
俺在hpux下试验可以

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-01-12 11:23 |只看该作者

一个进程可以同时向两个终端窗口输出(printf)字符吗?

你的方法当然也是可以的。不过实际使用中牵扯到很多问题,例如
要写到哪个终端?如何找到它?
是否有写入的权限?
用洪水般的字符流破坏写入终端的显示是否礼貌?
当该终端用户登出时如何处理?
然后当另一用户碰巧登录到该终端时,也许他只能面对狂野的字符洪流目瞪口呆而无法进行任何正常工作?

所以不需要考虑的那么复杂,我们不必拘泥于楼主的思路。Unix的哲学之一:简单就是美。

论坛徽章:
0
5 [报告]
发表于 2005-01-12 11:39 |只看该作者

一个进程可以同时向两个终端窗口输出(printf)字符吗?

对,有道理,不过如果telnet的话,是可以找到自己的窗口的,我确实是被“写入另一个终端“局限住了,实际上实现的方法很多的,

论坛徽章:
0
6 [报告]
发表于 2005-01-12 22:19 |只看该作者

一个进程可以同时向两个终端窗口输出(printf)字符吗?

多谢各位的参与,philonis 的 2> /dev/pts/xxx 是正解
xxx可以在另一个终端里运行tty得到
只是如何在shell命令里开一个新终端,并得到它的xxx,然后在原终端执行command -a -b 2>xxx
这是一个问题


不过需求又变成可见(查)的流水行数可以少些,滚过去的也不要求能拉回来看
但是一定要行列格式,即首行为各列的标题说明

这样,stderr跨屏输出的模式反而不行了(它的优点是行数可以很多-取决于终端程序的行缓冲,但是它不可能有一个标题说明行,除非每隔若干行重复输出一次)
只能采用curses.h的模式,把原来的状态信息压缩,省出大半的屏幕位置用来滚动流水信息

哎,需求没说清楚,害死人呐。


只有把原来的状态信息(用于通讯的线程池的各个线程的处理阶段)压缩为每个线程以一个字符表达(原来是一个字符串),省出大半屏,先固定显示一个标题说明行,在其下面显示最新的滚动信息,有更新的信息,则先把已有的这些上移一行,(最靠近标题说明行的信息就不再显示了,也再也不会找到了-不过用户认为这是运行、应该的),再把新的信息显示在最后一行

今天也基本实现了,只是很容易出现段错误,可能是各个线程都更新自己的状态和添加滚动信息--而屏蔽这些屏幕输出,则一直没出错
可能屏幕输出机制需要改进一下

论坛徽章:
0
7 [报告]
发表于 2005-01-12 23:17 |只看该作者

一个进程可以同时向两个终端窗口输出(printf)字符吗?

有的终端可以控制启动的,例如xterm,在命令行下
xterm&
即可
得到一个本机活动终端的pts/xxx也可可以实现
who|grep "本机IP"|grep "程序属主用户名"
看到什么,是不是有启动时间这个域?计算一下启动终端命令需要多少时间,处理并匹配一下时间,基本上可以取出符合要求的终端号,虽然可能不很精确,但基本上应该不会刷错终端~万一错了大概也不会有太大影响吧~毕竟是本机的终端~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP