Why are there so many /dev/tty in Linux?

In ubuntu 10.04, if I check under /dev, there are more than 50 ttys. tty0, tty1, tty2....

I understand tty is a character device for console input/output.

  1. but why is there so many of them? is it something like pool?

  2. and what is the difference between /dev/pts/0, 1, 2... , /dev/tty?

  3. If I open up a terminal, new number is created under /dev/pts. but I don't know when /dev/tty? is used.

    even if I create a SSH connection, number of /dev/tty s are same.

    and if I do

    cat /dev/tty0
    

    and type something in keyboard, I get corresponding outputs. why is this happening?


Solution 1:

The ttys are not just input/output devices. They also do a special job of acting as the controlling terminal for a session, like sending signals (Ctrl+C). /dev/ttyNN are virtual consoles, which are full screen displays on the monitor.

The terminals start from /dev/tty1. You could switch to these consoles, usually, by pressing Ctrl+Alt+Fn keys.

e.g, Ctrl+Alt+F1 takes you to the first virtual terminal. Nowadays, most of the Linux distributions run the X server from the tty1. So, pressing Ctrl+Alt+F1 may not have an effect.

$ ps ax | grep Xorg | grep -v grep
 1504 tty1     Ss+   44:57 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-rfsWyA/database -nolisten tcp vt1

Ctrl+Alt+F2 will take you to the second terminal. Usually the distributions run a login program(agetty) on the virtual terminal.

$ ps ax | grep tty2 | grep -v grep
31865 tty2     Ss+    0:00 /sbin/agetty tty2 38400

The login programs provide you a login prompt and lets you login with username/password. The init scripts decides, where all the login program will be run. So depending on that you may or may not see a login prompt on, say tty9. To go back to your GUI interface, press Ctrl+Alt+F1(as in example output above).

/dev/tty0 is a special device, which points to the current terminal. So, irrespective of where you run it from(any virtual console), anything read from/written to tty0 goes to your current terminal.

The second column in 'ps ax' also gives the controlling terminal of the program. For some programs, like daemons, you may see that the column is '?', which means they are not bound to a terminal.

/dev/pts/0 etc are psuedo-terminal devices, which are not attached to the system display. for e.g, terminal you get when you open a gnome-terminal or any other GUI terminal. These are client-server based approach where client side will be exported to programs, like bash. The data send by the program to the pseudo terminal is sent to the 'server' side (which is usually monitored by another program, like gnome-terminal). The controlling process (server side) determines what needs to be sent to the terminal, which is eventually seen by the client. These devices help you to open multiple 'GUI terminals' without any limit on your system, still providing the same old terminal like controls(ioctl(), colour setting, Sending signals [Ctrl+C] etc. ).

Solution 2:

I just want to clarify the relationships of this kind of things.

First, /dev/tty is at process level, it can be ttyn(tty1, tty2,...), ttySn(ttyS0, ttyS1), pty(pts/0, pts/1), and something else.

/dev/tty0 is a alias of current(foreground) virtual console, so it could be tty1, tty2, and so on. Notice that ttyS0 is not a alias; It's the first serial port.

/dev/console is the system console, it points to /dev/tty0 as a default. It can be ttyn, ttySn, ttyUSBn, lpn, and so on.

Roughly, /dev/tty > /dev/cosole > /dev/tty0