需要使用程序切换控制台屏幕程序的看过来

发表于:2007-05-26来源:作者:点击数: 标签:
翻了翻5年前的备份找出来的,呵呵,自己写的程序都有些看不懂了 [quote:191f8258d4] #includestdio.h #includefcntl.h #includesys/vtkd.h main(intargc,char*argv[]) { longscr_no; intfd; chardesname[20]; chartmp[40]; intretval; FILE*fp; if(argc==1is

翻了翻5年前的备份找出来的,呵呵,自己写的程序都有些看不懂了

[quote:191f8258d4]
#include <stdio.h>
#include <fcntl.h>
#include <sys/vtkd.h>
main(int argc,char *argv[])
{
long scr_no;
int fd;
char desname[20];
char tmp[40];
int retval;
FILE *fp;
if (argc==1 && isatty(1)) {
strcpy(desname,"");
strcpy(desname,ttyname(1));
}
else {
if (argc!=2 || ((scr_no=atoi(argv[1])) < 1 || scr_no>12)) {
printf("Usage: ./switch_scr screen_no(1-12)\n");
exit(1);
}
sprintf(desname,"/dev/tty%02d",scr_no);
}
scr_no=atoi(&desname[strlen(desname)-2]);
printf("switch to %s ... No:%d \n",desname,scr_no);
fd=open(desname,O_RDONLY|O_NDELAY);
if (fd<0) {
sprintf(tmp,"open tty%02d",scr_no);
perror(tmp);
exit(1);
}
scr_no--;
retval=ioctl(fd,VT_ACTIVATE,scr_no);
if (retval<0) {
sprintf(tmp,"ioctl tty%02d active",1+scr_no);
perror(tmp);
exit(1);
}
fp=freopen(desname,"r",stdin);
if (fp==NULL) {
sprintf(tmp,"reopen tty%02d as stdin",1+scr_no);
perror(tmp);
exit(1);
}
fp=freopen(desname,"w",stdout);
if (fp==NULL) {
sprintf(tmp,"reopen tty%02d as stdout",1+scr_no);
perror(tmp);
exit(1);
}
fp=freopen(desname,"w",stderr);
if (fp==NULL) {
sprintf(tmp,"reopen tty%02d as stderr",1+scr_no);
perror(tmp);
exit(1);
}
printf("");
retval=getchar();
printf("press %d\n",retval);
}
[/quote:191f8258d4]

 simonzhan 回复于:2004-08-30 09:35:42
不错的说,加精!

 ywsun 回复于:2004-08-30 11:05:52
努力的看!

 htldm 回复于:2004-08-30 11:07:18
确实是好东西。帮顶!

 -j- 回复于:2004-08-30 12:56:58
有困难要上,没有困难...创造困难也要上! 
哈哈哈哈

 pxlh 回复于:2004-08-30 14:20:54
呵,看不懂,,,能否说说是如何使用的,,,有什么作用.....

 CNL 回复于:2004-08-30 18:23:52
呵呵,主要有网友问如何在控制台下实现当前屏幕的切换,
这个程序比如你在tty12下有个后台程序,
有时候需要跑出来让别人知道你在tty12很辛苦,你可以在程序中调一它
"./switch_scr 12"
当然switch_scr就是我贴的程序,12是切换到的屏幕号,
这样控制台好象被按了Alt+F12一样就到了tty12了,
就是个这,好玩而已。 8)

 simonzhan 回复于:2004-08-30 20:27:47
这个如果用来发通知时候很用的说,很有实用价值的。

 legendfan 回复于:2004-08-30 21:19:56
我个就是我所要的,谢谢CNL精灵王!!!

努力学习!!

 lvgq2001 回复于:2004-08-31 19:43:10
弟兄们,其实你们用不着这么麻烦,SCO本身提供一个控制序列执行该操作!
echo "\033[0z" 即可切换到第一虚拟屏!
屏幕ID 从0-11分别代表第1-12虚拟屏,在你的shell程序中你可以自由的
切换屏幕,如果你写一个后台程序用cron调用来提醒你,那么你应该
echo "\033[0z" > /dev/tty01(or 02~...12)另外应该由root来处理
上述操作,避免出现权限问题!
如果你想做的更好一点,你还应该注意不要弄乱你定向到的那一屏的光标,
echo -n "\0337\033[10z\0338" > /dev/tty01
(保存及恢复光标位置)
关于控制序列还有很多很多,要靠你去发现,我知道的也很少,大家一起
去搜集控制序列可以使你的程序处理很方便!

 CNL 回复于:2004-08-31 20:10:28
兄弟你还是没有理解这个程序啊!

打个比方,
把这个程序改成函数,接收需要接管的屏幕号码,
如果有个程序是本来在第1屏幕运行的,
调用函数switch_scr(12)之后原来那个第1屏幕的程序就到了第12屏幕,
原来的程序也可以是后台程序,压根就没有和屏幕相连,
这样它就接管了第12屏幕的输入输出,不只是把当前屏幕简单地切到12屏,
而是把程序也送过去

 legendfan 回复于:2004-08-31 20:24:53
还是CNL学的没错,我正是需要这种功能。

 li2002 回复于:2004-09-01 08:47:35
好贴,试试看~~

 老查 回复于:2004-09-18 14:02:32
你们的方法都有效,打个比方,我们俩见面,我去你家,你来我家,结果是差不多的。只不过,方法不同。

>`tty` 可以实现在单前屏显示。用在中创备份shell中,很实用。

大家切磋。

 zhkun 回复于:2004-09-18 15:31:19
ttyp20,ttyn50,ttys60也可以切换吗,ttyn50,ttys60是网络终端。

 CNL 回复于:2004-09-18 17:06:51
这个程序肯定不行,起码把1-12的限制去掉:
scr_no=atoi(argv[1])) < 1 || scr_no>12

至于能不能实现你的要求,我没有网络终端,不知道啊

 slnhghm 回复于:2004-09-18 21:41:50
有用

原文转自:http://www.ltesting.net