全部博文(92)
分类: LINUX
2006-08-26 11:53:23
程序清单如下:
#include ″stdio.h″
#include ″signal.h″
#include ″time.h″
#include ″sys/types.h″
#include ″sys/fcnt1.h″
#include ″sys/vt.h″
#include ″sys/termio.h″
int vtlog (char *errmsg,char *file,int line)
{
FILE *fp;
char logfile[]=″/tmp/vtlog″;
char buf[100];
time_t ii;
memset(buf,0,100);
ii=time((time_t*)0);
strcpy(buf,ctime(&ii)+4);
buf[15]=0;
if((fp=fopen(logfile,″a″))==NULL) /*打开日志文件*/
return -1;
if((file==NULL)&&(line==0))
fprintf(fp,″%s %s\n″,buf,errmsg);
else
fprintf(fp,″%s File %s line %d:%s\n″,buf,file,line,
errmsg);
fclose(fp)
return 0;
}
void (*istat)(int),(*qstat)(int);/*用于保存原来的信号地址*/
/***********************************/
int Init_VT()
{
int fd,fd0,fd1 fd2;
long vt_avail;
pid_t childpid;
char termname[20];
char buf[128〗;
struct termios ParTerm;
struct termio termiopm;
char prompt[20];
time_t tbuf;
if((fd=open)″/dev/vt00″,O_RDWR,010010766
70))==-1){
vtlog(″不能打开文件/dev/vt00!″,_FILE_,_LINE_);
exit(-1);
}
if(ioct1(fd,VT_OPENQRY,&vt_avail)==-1){
vtlog(″无可利用的虚终端!″,_FILE_,_LINE_); exit(-1);
}
close(fd);
close(2);
close(1);
close(0);
if((childpid=fork())< 0){ /*fork子进程*/
vtlog("fork错误!\n″,_FILE_,_LINE_);
exit(-1);
}
else if(childpid>0)
exit(0); /*父进程退出*/
if(setpgrp()< 0) {
vtlog(″设置进程组标识错误!″,_FILE_,_LINE_); exit(-1);
}
sprintf(termname,″/dev/vt%02d″,vt_avail);
if((fd0=open(termname,O_RDWR,01014020330))==-1){
vtlog(″不能打开新的虚终端!″,_FILE_,_LINE_);
;exit(-1);
}
fd1=dup(fd0);
fd2=dup(fd0);
if(ioct1(fd0,TCGETS,&ParTerm)==-1){
vtlog(″不能取term 参数!″,_FILE_,_LINE_);
exit(-1);
}
ParTerm.c_1f1ag |=ICANON;
ParTerm.c_1f1ag |=ECHO;
ParTerm.c_1f1ag |=ECHOE;
ParTerm.c_cc[2]=CTRL('h');
ParTerm.c_cc[3]=CTRL('x');
ParTerm.c_cc[4]=4;
ParTerm.c_cc[5]=5;
ParTerm.c_iflag &=~ISTRIP;
ParTerm.c_cflag 1=CS8;
ParTerm.c_cflag &=~PARENB;
if(ioct1(fd0,TCSETSW,&ParTerm)==-1){
vtlog(″不能设置term参数!″,_FILE_,_LINE_);
exit(-1);
}
if(ioct1(fd1,TCGETA,&termiopm)==-1){
vtlog(″不能取 term参数!″,_FILE_,_LINE_);
}
istat=signal(SIGINT,SIG_DFL);
qstat=signal(SIGQUIT,SIG_DFL);
if(ioctl(fd0,VT_ACTIVATE,vt_avail)==-1){
vtlog(″激活虚终端失败!″,_FILE_,_LINE_);
exit(-1);
}
if(ioctl(fdo,VT_WAITACTIVE,NULL)==-1){
vtlog(″等待激活虚终端失败!″,_FILE_,_LINE_);
exit(-1);
}
sprintf(prompt,″PS1=VT %1d>″,vt_avail); putenv(prompt);
}
/*______________主函数,可根据具体情况编制________*/
int main()
{ Init_VT();
system(″sh″); /*可根据自己的需要灵活设计,如;
用gets函数读取输入,对输入的命令加以分析,然后用exec等函数去执行,即为一个shell程序了*/
;return 0;
}