Discussion:
questions about linux termios
pei lin
2008-07-14 15:08:11 UTC
Permalink
Hi,buddy
I am puzzled by the linux termios.
First Question about /dev/tty0 and /dev/tty,this two devices is
the same one?
When i am in X terminal,as /dev/pts/0 , i do "echo hello >
/dev/pts/0 and echo hello > /dev/tty ", they return the same like that
"hello" on the screen .This means /dev/tty ->/dev/pts/0? But "echo
hello > /dev/tty0",there is nothing on the screen.And when i go to
Init 3 mode ,like /dev/tty1,when i do "echo hello > /dev/tty1 and echo
hello > .dev/tty and echo hello > /dev/tty0" ,They return the same all
print hello on the screen.Do they all point to the /dev/tty1?

The second Question is that i write a small program to get
keyboard input like below.When i run it in X terminal ,when i press
keyboard it can return but can not get the press and release event.And
in the console,like tty1,it doesn't work .i don't know why.

file : get_keyboard.c

#include <stdio.h>
#include <linux/keyboard.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/kd.h>
#include <termios.h>
#include <unistd.h>
int main()
{
int fd,len,i;
struct kbentry entry;
unsigned char buf[64];
struct termios ts,old_ts;
char * path;
path = ttyname(0);
printf("%s!\n",path);
fd = open(path, O_RDONLY|O_NOCTTY);
if(fd < 0){
printf("open the device error!\n");
}

printf("fd --- %d!\n",fd);

if (ioctl( fd, KDSKBMODE, K_RAW ) < 0) {
printf("set mode wrong!\n");
}


tcgetattr( fd, &old_ts );


ts = old_ts;
ts.c_cc[VTIME] = 0;
ts.c_cc[VMIN] = 1;
ts.c_lflag &= ~(ICANON|ECHO|ISIG);
ts.c_iflag = 0;
tcsetattr( fd, TCSAFLUSH, &ts );

tcsetpgrp( fd, getpgrp() );


entry.kb_table = K_NORMTAB;
entry.kb_value = 0;

while(1){
len=read(fd,buf,64);
printf("len ========= %d!\n",len);
for(i =0; i < len;i++){
entry.kb_index = buf[i];
if(ioctl(fd,KDGKBENT,&entry)){
printf("struct entry :%d %d
%d\n",entry.kb_table,entry.kb_index,entry.kb_value);
if('2' == entry.kb_index){
tcsetattr( fd, TCSAFLUSH, &old_ts );
exit(0);
}
}
}
}
}
--
To unsubscribe from this list: send the line "unsubscribe linux-console" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Frederic Marmond
2008-07-14 18:38:36 UTC
Permalink
Hi,=20
first question:
/dev/tty is the CURRENT terminal, wherever you are, and tty0 is the fir=
st one.
So, echo "foobar" > /dev/tty will always display "foobar" on your curre=
nt=20
terminal.
second question: no time right now, maybe latter...

=46red
Post by pei lin
Hi,buddy
I am puzzled by the linux termios.
First Question about /dev/tty0 and /dev/tty,this two devices is
the same one?
When i am in X terminal,as /dev/pts/0 , i do "echo hello >
/dev/pts/0 and echo hello > /dev/tty ", they return the same like tha=
t
Post by pei lin
"hello" on the screen .This means /dev/tty ->/dev/pts/0? But "echo
hello > /dev/tty0",there is nothing on the screen.And when i go to
Init 3 mode ,like /dev/tty1,when i do "echo hello > /dev/tty1 and ech=
o
Post by pei lin
hello > .dev/tty and echo hello > /dev/tty0" ,They return the same al=
l
Post by pei lin
print hello on the screen.Do they all point to the /dev/tty1?
The second Question is that i write a small program to get
keyboard input like below.When i run it in X terminal ,when i press
keyboard it can return but can not get the press and release event.An=
d
Post by pei lin
in the console,like tty1,it doesn't work .i don't know why.
file : get_keyboard.c
#include <stdio.h>
#include <linux/keyboard.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/kd.h>
#include <termios.h>
#include <unistd.h>
int main()
{
int fd,len,i;
struct kbentry entry;
unsigned char buf[64];
struct termios ts,old_ts;
char * path;
path =3D ttyname(0);
printf("%s!\n",path);
fd =3D open(path, O_RDONLY|O_NOCTTY);
if(fd < 0){
printf("open the device error!\n");
}
printf("fd --- %d!\n",fd);
if (ioctl( fd, KDSKBMODE, K_RAW ) < 0) {
printf("set mode wrong!\n");
}
tcgetattr( fd, &old_ts );
ts =3D old_ts;
ts.c_cc[VTIME] =3D 0;
ts.c_cc[VMIN] =3D 1;
ts.c_lflag &=3D ~(ICANON|ECHO|ISIG);
ts.c_iflag =3D 0;
tcsetattr( fd, TCSAFLUSH, &ts );
tcsetpgrp( fd, getpgrp() );
entry.kb_table =3D K_NORMTAB;
entry.kb_value =3D 0;
while(1){
len=3Dread(fd,buf,64);
printf("len =3D=3D=3D=3D=3D=3D=3D=3D=3D %d!\n",len);
for(i =3D0; i < len;i++){
entry.kb_index =3D buf[i];
if(ioctl(fd,KDGKBENT,&entry)){
printf("struct entry :%d %d
%d\n",entry.kb_table,entry.kb_index,entry.kb_value);
if('2' =3D=3D entry.kb_index){
tcsetattr( fd, TCSAFLUSH, &old_ts );
exit(0);
}
}
}
}
}
--
To unsubscribe from this list: send the line "unsubscribe linux-assem=
bly"
Post by pei lin
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-console=
" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Loading...