翻了翻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/ttyd",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 ttyd",scr_no);
perror(tmp);
exit(1);
}
scr_no--;
retval=ioctl(fd,VT_ACTIVATE,scr_no);
if (retval<0) {
sprintf(tmp,"ioctl ttyd active",1 scr_no);
perror(tmp);
exit(1);
}
fp=freopen(desname,"r",stdin);
if (fp==NULL) {
sprintf(tmp,"reopen ttyd as stdin",1 scr_no);
perror(tmp);
exit(1);
}
fp=freopen(desname,"w",stdout);
if (fp==NULL) {
sprintf(tmp,"reopen ttyd as stdout",1 scr_no);
perror(tmp);
exit(1);
}
fp=freopen(desname,"w",stderr);
if (fp==NULL) {
sprintf(tmp,"reopen ttyd 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 |
| 有用 |




