Jay Taylor's notes
back to listing indexThe TTY demystified
[web search]Forum |
---|
Register |
Log in |
Latest comments |
Syndication |
---|
RSS feed |
Feedback |
---|
linus@linusakesson.net |
The TTY demystified
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
The -a flag tells stty to display all settings. By default, it will look at the TTY device attached to your shell, but you can specify another device with -F.
Some of these settings refer to UART parameters, some affect the line discipline and some are for job control. All mixed up in a bucket for monsieur. Let's have a look at the first line:
speed | UART | The baud rate. Ignored for pseudo terminals. |
rows, columns | TTY driver | Somebody's idea of the size, in characters, of the terminal attached to this TTY device. Basically, it's just a pair of variables within kernel space, that you may freely set and get. Setting them will cause the TTY driver to dispatch a SIGWINCH to the foreground job. |
line | Line discipline | The line discipline attached to the TTY device. 0 is N_TTY. All valid numbers are listed in /proc/tty/ldiscs. Unlisted numbers appear to be aliases for N_TTY, but don't rely on it. |
Try the following: Start an xterm. Make a note of its TTY device (as reported by tty) and its size (as reported by stty -a). Start vim (or some other full-screen terminal application) in the xterm. The editor queries the TTY device for the current terminal size in order to fill the entire window. Now, from a different shell window, type:
stty -F X rows Y
where X is the TTY device, and Y is half the terminal height. This will update the TTY data structure in kernel memory, and send a SIGWINCH to the editor, which will promptly redraw itself using only the upper half of the available window area.
The second line of stty -a output lists all the special characters. Start a new xterm and try this:
stty intr o
Now "o", rather than ^C, will send a SIGINT to the foreground job. Try starting something, such as cat, and verify that you can't kill it using ^C. Then, try typing "hello" into it.
Occasionally, you may come across a UNIX system where the backspace key doesn't work. This happens when the terminal emulator transmits a backspace code (either ASCII 8 or ASCII 127) which doesn't match the erase setting in the TTY device. To remedy the problem, one usually types stty erase ^H (for ASCII 8) or stty erase ^? (for ASCII 127). But please remember that many terminal applications use readline, which puts the line discipline in raw mode. Those applications aren't affected.
Finally, stty -a lists a bunch of switches. As expected, they are listed in no particular order. Some of them are UART-related, some affect the line discipline behaviour, some are for flow control and some are for job control. A dash (-) indicates that the switch is off; otherwise it is on. All of the switches are explained in the stty(1) man page, so I'll just briefly mention a few:
icanon toggles the canonical (line-based) mode. Try this in a new xterm:
stty -icanon; cat
Note how all the line editing characters, such as backspace and ^U, have stopped working. Also note that cat is receiving (and consequently outputting) one character at a time, rather than one line at a time.
echo enables character echoing, and is on by default. Re-enable canonical mode (stty icanon), and then try:
stty -echo; cat
As you type, your terminal emulator transmits information to the kernel. Usually, the kernel echoes the same information back to the terminal emulator, allowing you to see what you type. Without character echoing, you can't see what you type, but we're in cooked mode so the line editing facilities are still working. Once you press enter, the line discipline will transmit the edit buffer to cat, which will reveal what your wrote.
tostop controls whether background jobs are allowed to write to the terminal. First try this:
stty tostop; (sleep 5; echo hello, world) &
The & causes the command to run as a background job. After five seconds, the job will attempt to write to the TTY. The TTY driver will suspend it using SIGTTOU, and your shell will probably report this fact, either immediately, or when it's about to issue a new prompt to you. Now kill the background job, and try the following instead:
stty -tostop; (sleep 5; echo hello, world) &
You will get your prompt back, but after five seconds, the background job transmits hello, world to the terminal, in the middle of whatever you were typing.
Finally, stty sane will restore your TTY device configuration to something reasonable.
Conclusion
I hope this article has provided you with enough information to get to terms with TTY drivers and line disciplines, and how they are related to terminals, line editing and job control. Further details can be found in the various man pages I've mentioned, as well as in the glibc manual (info libc, "Job Control").
Finally, while I don't have enough time to answer all the questions I get, I do welcome feedback on this and other pages on the site. Thanks for reading!
Posted Friday 25-Jul-2008 19:46
Discuss this page
Disclaimer: I am not responsible for what people (other than myself) write in the forums. Please report any abuse, such as insults, slander, spam and illegal material, and I will take appropriate actions. Don't feed the trolls.
Jag tar inget ansvar för det som skrivs i forumet, förutom mina egna inlägg. Vänligen rapportera alla inlägg som bryter mot reglerna, så ska jag se vad jag kan göra. Som regelbrott räknas till exempel förolämpningar, förtal, spam och olagligt material. Mata inte trålarna.
Sun 24-Aug-2008 23:36
- the tty system really gets demystified here.
Only a small correction:
Your statement "icanon switches between raw and cooked mode" is not completely true.
'stty -icanon' still interprets control characters such as Ctrl-C whereas 'stty raw' disables even this and is the real raw mode.
Greetings,
-Andreas.
Linus Åkesson
Fri 29-Aug-2008 18:42
- the tty system really gets demystified here.
Only a small correction:
Your statement "icanon switches between raw and cooked mode" is not completely true.
'stty -icanon' still interprets control characters such as Ctrl-C whereas 'stty raw' disables even this and is the real raw mode.
Thanks!
Yes, you're quite right. I've fixed it.
Wed 26-Nov-2008 08:13
Wed 10-Dec-2008 13:27
Keep doing things like this please...
Excelente!
Muchas Gracias
Fede Tula
Sat 20-Dec-2008 06:20
The process P is a pg leader if P.PID = P.PGID. In the example of the article, "Job" means process group, and ls (103) is a process group leader:
ls.PID = 103
ls.PGID = 103
ls.SID = 101
ls.CTTY = /dev/pts/0
Suppose we allow ls to call setsid(2). This would have the following consequences:
ls.PID = 103 # unchanged
ls.PGID = 103 # set to ls.PID, but in fact this is no change!
ls.SID = 103 # set to ls.PID
ls.CTTY = <none>
Now ls is session leader (ls.SID = ls.PID), and ls is process group leader (ls.PGID = ls.PID).
At this point, however, sort (104) would belong to a process group (103) whose leader's (ls's) SID (103) doesn't match sort's SID (101)!
sort.PID = 104
sort.PGID = 103
sort.SID = 101
the pg leader for pg 103 is ls (103):
ls.PID = ls.PGID = 103 = sort.PGID
however
ls.SID = 103 != 101 = sort.SID
We have two processes in the same process group belonging to different sessions!
ls is prevented from calling setsid() because as current process leader its PGID doesn't change when it is set to its PID, while its SID changes. Thus it would leave the session while staying in the process group.
Sort, OTOH, can call setsid(), becuase it also leaves the process group:
sort.PID=104
sort.PGID=104 # leaves process group too
sort.SID=104
sort.CTTY=<none>
fork(2)-ing and calling setsid(2) in the child helps, because the child gets a new PID, which will be different from any PGID of the parent (as that PGID was the PID of some process), and so when the child calls setsid(2), the child.PGID := child.PID operation will actually change the child's inherited PGID and so the child will be able to leave the process group.
Right after fork():
parent.PGID = some_old_PID
child.PID = new_PID
child.PGID = parent.PGID = some_old_PID
The child calls setsid():
child.PGID = child.PID = new_PID != some_old_PID = parent.PGID
A session leader *could* call setsid(), despite also being a process group leader, since neither its PGID nor its SID would change. However, its CTTY would be set to <none>, and this would result in a situation where the original controlling process (= a session leader with a CTTY), for example, your shell, has no more access to the terminal!
Furthermore, there is the rule that when a controlling process dies, each session member (each process P with P.SID = SL.SID) loses access to the terminal (and possibly get a SIGHUP on the next read/write). This clearly shows the intent that no session member shall have access to the terminal when the session leader has none. This principle would be violated if the current session leader could detach from the CTTY by calling setsid(). (Or all session members would have to lose access to the CTTY, just as if the session leader died.)
Thu 25-Dec-2008 20:19
Mon 20-Apr-2009 10:28
Tue 2-Jun-2009 21:27
Mon 15-Jun-2009 18:10
Riff
www.absolute-anonymity.us.tc
Mon 15-Jun-2009 21:59
Tue 16-Jun-2009 00:41
Tue 16-Jun-2009 02:22
Tue 16-Jun-2009 04:38
Tue 16-Jun-2009 08:57
script to make commands like less (more) adapt to changed screen size.
It even tries to exit from the command leaving the cursor on the "correct" place.
The kludge should work well with anything, that ought to be updated because of
a change in terminal window size.
CAVEATS
It's written for Unix under Mac OsX, doesn't really know if tput are implemented under Linux.
Well here we go. I'm sorry for the loss of tabs, it should have been indented.
I have used this for a year and a half and it really works.
#! /bin/bash
export LESS=" -I -r -f -J -S -g -M -x 4"
# -I ignore case when searching
# -r "raw" do not preparate ctrl-chars,
# -f force open special files (may be binary) BEWARE OF ANSISEQUENCES.
# -J show status column
# -S chop long lines.
# -g highlight on last hit in the search.
# -M Most Verbose status column...
# -x 4 tabspacing = 4
# -------------------------------------- the kludge starts here.................
ORIGLINES=$LINES
ESC=`printf "\e"`
ScreenRedraw_off=`echo -n "$ESC""[8m"`
ScreenRedraw_on=`echo -n "$ESC""[0m"`
function OkayScreen()
{
export PS1="" # Turns off the prompt to avoid cluttering..
echo -n ${ScreenRedraw_off}
CURLINES=`bash -i < ~/bin/kludge.bash `
# ^^^^^^^^^^^ NB! the path where kludge.bash should be placed.
if [ $CURLINES -gt $ORIGLINES ] ; then
TO_SKIP="$(expr "$CURLINES" '-' "$ORIGLINES")"
if [ $TO_SKIP -lt 3 ] ; then
TO_SKIP="$(expr "$TO_SKIP" '-' '2')"
else
TO_SKIP="$(expr "$TO_SKIP" '-' '1')"
fi
tput cuu 1 #cursor up one line
echo -n ${ScreenRedraw_on}
echo -n "\$" #restores prompt
echo -n ${ScreenRedraw_off}
tput cud $TO_SKIP
echo -n ${ScreenRedraw_on}
echo # activate cli correct position.
else
tput cuu 2
echo ${ScreenRedraw_on}
fi
}
trap OkayScreen SIGWINCH
# if [ -t 0 ] ; then # /* this enables syntax highlighting */
# $VIMRUNTIME/macros/less.sh $@ /* After tinkering with vim */
# else
/usr/bin/less $@
# fi
trap '' SIGWINCH
# cp ./tmp/.vimrc~
Tue 16-Jun-2009 09:05
Forgot the innerpart, which makes it all work ....
This is a second script called kludge.bash which I have in my ~/bin folder.
Needs to execute this to get the changed winsize in a new process since at
least bash 2.05a didn't update the LINE variable in active process in the terminal window.
#! /bin/bash
# ### SYS Finds the number of lines in a window after window rechange - less... !#
# kludge.scr - to be placed in the ~/bin folder is the inner workings of the bash script named less
PS1=""
shopt -s checkwinsize
echo $LINES
Wed 17-Jun-2009 01:58
I'd recommend adding some info about the *wide* spread myth of parent's death triggering SIGHUPs for all its children.
Recall that the related behavior only applies to session leaders, and is triggered in any of the two following cases:
#1:
IF session leader exiting
..IF it has ctty
....send SIGHUP to foreground PG
..ELSE
....send SIGHUP to foreground PG at last time it had ctty
#2:
IF session leader detaching (TIOCNOTTY)
..send SIGHUP to foreground PG
--JuanJo
Wed 17-Jun-2009 12:42
#1:
IF session leader exiting
..IF it has ctty
....send SIGHUP to foreground PG
..ELSE
....send SIGHUP,SIGCONT to foreground PG at last time it had ctty
#2:
IF session leader detaching (TIOCNOTTY)
..send SIGHUP,SIGCONT to foreground PG
See: http://google.com/codesearch/p?hl=en&sa=N&cd=2&ct=rc#p4tPAkVsQ_c/linux-2.2.26/drivers/char/tty_io.c&l=537"
--JuanJo AKA jjo
Linus Åkesson
Sun 21-Jun-2009 14:58
Thu 30-Jul-2009 15:07
Thu 30-Jul-2009 21:09
Sat 1-Aug-2009 00:14
Good tips =)
Mon 10-Aug-2009 09:21
Sun 16-Aug-2009 17:32
Every once in a while I get up the ambition to complain about the width of text on a web page, and you're the lucky winner today--sorry ;-)
This could be a good article--from the looks of it, it probably is--but why is it (and so many other web pages today) so wide?
Checking one line at random, it is 130 characters wide:
echo "Meanwhile, however, the computers — still quite large and primitive, but able to multitask — were becoming powerful enough to" | wc
1 20 130
Oh, and I'm ignoring the stuff in the left hand panel / column--I simply horizontally scroll so that panel is not visible.
I have three choices if I want to read your article:
* horizontally scroll on each line
* set the type size very small (or zoom out), so an entire line appears on the screen, then use a magnifying glass
* copy and paste the text to a file and read it in an editor--possibly deleting hard line breaks to let the text flow better.
Ideally, and I've seen it done this way, so I believe it can be done:
* the text should be arranged to wrap to the width of the (reader's) window
* if there are long lines of code (pre-formatted text), or wide pictures, or something like that, the other text should still wrap to the width of the reader's window, although he'll have to horizontally scroll to see the full picture or code or whatever. (This is the part I'm specifically referring to as having seen done, but I can't remember any details (like an example, or how to do it--I'll try to pay attention and find some).
Anyway, sorry for the rant--thanks for making the effort to create and disseminate pages with information like this!
Randy Kramer
Fri 4-Sep-2009 11:24
Sat 12-Sep-2009 16:09
Well Done!
Wed 23-Sep-2009 16:26
Sat 17-Oct-2009 10:12
Tue 3-Nov-2009 18:53
Thu 5-Nov-2009 20:54
Tue 22-Dec-2009 21:58
Tue 9-Feb-2010 08:34
Thu 15-Apr-2010 11:08
Tue 4-May-2010 10:36
Wed 12-May-2010 03:00
Thu 13-May-2010 03:17
Linus Åkesson
Thu 13-May-2010 17:33
TeleTYpe.
Wed 14-Jul-2010 05:21
Sat 24-Jul-2010 16:28
Sun 25-Jul-2010 02:31
I am currently working on writing a toy OS, and this was very useful in its treatment of the basic structure of the TTY subsystem. Thanks.
Ralph Corderoy
Sun 25-Jul-2010 16:22
The erase and kill characters used to be # and @, and as you were printing on paper there was no rubbing out, so you might see
$ ls @wc -l /etvc##c/passwd
42 /etc/passwd
$
where the `@' was killing the whole line entered so far and the `##' was erasing the preceding `vc'.
It's only modern shell that provide line editing, hence shell history substitutions like `!!' and `!$' existing. If /bin/sh is a plain old non-line-editing shell on your system then you can see the difference in tty settings by using `stty -a' from another terminal to capture the differences. Don't run stty(1) from, e.g., the bash shell since the shell will alter the tty settings before running stty. Here, bash has the literal next character, lnext, being undefined and turns off -icrnl, -icanon, and -echo.
The above example of # and @ was achieved by
$ sh
$ stty erase \# kill @ -crterase -echok
$ ls @wc -l /etvc##c/passwd
42 /etc/passwd
$ stty sane
$ exit
$
where /bin/sh is dash(1) on this Ubuntu system.
"Write permissions to the device file are required, so when a user logs in on a particular TTY, that user must become the owner of the device file." I think it's read permission that's required to alter a tty's settings. It did used to be write, in the very early days, but since write(1) and mesg(1) meant users could write to one another's terminals it also meant they could alter their settings. Much fun could be had with changing erase to `e' for a second and back again at random intervals whilst the user was trying to type. So it was switched to require read permission which only the owner of tty normally has. This can be seen in stdin of stty needing to be re-directed to specify the terminal, and not stdout, e.g. `stty -a </dev/pts/1'.
Flow control, e.g. ^S and ^Q, existed long before the signals for job control. IIRC, it was Berkeley that added all the ^Z stuff and related signals, it wasn't Bell Labs.
The Linux kernel doesn't bother to implement all of the normal control characters. Flush is one that's missing, IIRC, which is set with stty's `eol2'. It's a shame.
Cheers,
Ralph.
P.S. There's a typo, `1970:s'.
Linus Åkesson
Sun 25-Jul-2010 18:14
ralph wrote:
Nice article, various points...Thanks! That was very interesting. It hadn't occured to me that erase/kill would be usable without interactive line editing, but it makes sense.
ralph wrote:
P.S. There's a typo, `1970:s'.Changed to 1970s.
Mon 2-Aug-2010 22:22
How can I restart it? I cannot reboot the machine. I can ssh into it from another machine.
Linus Åkesson
Thu 5-Aug-2010 10:10
How can I restart it? I cannot reboot the machine. I can ssh into it from another machine.
I don't know what's wrong in your particular case, but it's init (pid 1) that's supposed to (re-)start the login program in each terminal. You can modify init's configuration at runtime by editing /etc/inittab and then doing "kill -HUP 1". But it's probably not an error in the configuration file, so use ps(1) to investigate what processes are running in the terminals.
Tue 10-Aug-2010 01:41
For another great source on TTY devices you can go to:
http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.genprogc/doc/genprogc/ttysys.htm
Enjoy,
Ori
Fri 13-Aug-2010 12:59
We want the part II were the concepts gets even closer to the Linux implementation...
just an example:
an xterm session under ssh when resized makes the TTY device to adjust the terminal size and generate SIGWINCH signal for the running app to know about the change...
but if the xterm is under a serial line when resize occurs NOTHING happens (not kernel side size update, not SIGWINCH signal)... I know under serial line xterm does not communicate the size change, well where is the the place to patch in order to solve this, from the xterm side it would be very easy to send a escape sequence telling the TTY driver the new size but this driver should be patched for catching it and react as in the ssh case....
Thanks for your out of ordinary (little or inexistant content + lot of google adds) article. I hope we can get a deeper version someday.
Pat
Sat 21-Aug-2010 05:00
A very interesting article. I have just published a related article on the terminals in French : http://www.etud.insa-toulouse.fr/~mcheramy/wordpress/?p=198
(And if you don't understand french, there are few interesting links in english at the end)
Thanks.
Max.
Fri 27-Aug-2010 14:22
Mon 25-Oct-2010 15:14
Wed 1-Dec-2010 15:45
Thu 9-Dec-2010 19:19
Sun 26-Dec-2010 22:32
Thu 6-Jan-2011 11:46
/Renjith G
Wed 12-Jan-2011 14:12
now i have a question.
linux use /dev/console in booting before the init called . so i write a progrm that run after kernel booted and pass my progrm with option init in boot parameter and bypass init program so the first program that run is my program.
this is my question : how i correct my program to resive signels from /dev/consoole?
Tue 25-Jan-2011 10:19
Thanks
Ambresh
Wed 9-Feb-2011 18:56
You may not consider this your remit, which is fair enough.
Wed 16-Feb-2011 08:57
Wed 23-Feb-2011 21:35
Fri 25-Feb-2011 23:10
Tue 1-Mar-2011 22:42
Regards,
Newman
Fri 18-Mar-2011 21:18
Mon 11-Apr-2011 20:08
goToAnotherSiteThen();
} else {
try {
readAndLearn();
}
catch(DontUnderstandException dde){
wiki(dde.getSubject());
}
finally {
enjoyArticle();
}
}
Wed 29-Jun-2011 14:19
Fri 1-Jul-2011 04:12
Mon 11-Jul-2011 16:18
Wed 7-Sep-2011 15:48
Wed 7-Sep-2011 15:49
Fri 9-Sep-2011 16:25
Mon 19-Sep-2011 22:32
Tue 27-Sep-2011 08:01
Fri 30-Sep-2011 16:39
I am currently working on Solaris sparc 10, where i am seeing below problem with default setting.
Shell is allowing me to type in only 256 characters. e.g.
bash-3.00$ cat
SunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLSunStudio12u1-SunOS-SPARC-tar-MLS
If i attempt to input more data nothing happens. After going through your notes it seems like i am crossing line buff limit. If yes can you please suggest how i can increase this limit
Minal Patil
Mon 24-Oct-2011 21:11
Wed 2-Nov-2011 03:21
can you please suggest how i can increase this limit
http://tinyurl.com/6yql6r8
Mon 14-Nov-2011 21:33
Just a note: “slander” only applies to verbal communication. For written, use the term “libel” instead. :-D
Tue 22-Nov-2011 16:04
Mon 12-Dec-2011 04:22
Wed 21-Dec-2011 04:20
These sercvices seem to fail, unless I login to a shell that has a proper TTY setup
(eg: PuTTY of any type of ssh session)
If I start up these services with a proper tty, they work and continue to run.
My theory is that on reboot or via root crontab there is no tty.
How can I create a psuedo tty master/slave pair underwhich to run these services so they work, with me doing a manual ssh login......?
Larry Wichter
Thu 12-Jan-2012 15:37
Wed 18-Jan-2012 01:00
Mon 20-Feb-2012 05:35
Mon 5-Mar-2012 18:15
Mon 2-Apr-2012 14:21
Mon 2-Apr-2012 19:14
If you're connected something like a VT100, the terminal handles line editing, and programs send control codes to the terminal to switch between cooked mode and raw mode. When virtual terminals were implemented, this functionality became part of the operating system to maintain compatibility with existing software.
Thu 12-Apr-2012 01:15
Sat 14-Apr-2012 13:54
Sat 14-Apr-2012 14:21
Having been around as the last of the Telex's died out, having designed UART circuits, worked on Xenix and Unix Systems, and naturally Linux systems, your article plugged some reasonable holes I had on the subject...
Thanks again...
Tue 17-Apr-2012 18:35
One thing I think it does lack is that when it's talking about signals, it should mention about Linux's new(ish) signalfd.
Sat 5-May-2012 16:56
From this article I gain general knowledge about architecture
of Linux devices(LowLevelDriver<->LineDiscipline<->HighLevelDriver).
It's really a core of Linux I/O.
Thank you very much.
___________________________
Sichkar Dmytro from Ukraine
dmbios@mail.ru
Wed 16-May-2012 01:52
Thu 24-May-2012 17:22
Mon 28-May-2012 04:48
David Blackman
Mon 4-Jun-2012 19:16
Mon 4-Jun-2012 21:11
Tue 5-Jun-2012 09:20
Tue 5-Jun-2012 21:07
RC Roeder
Wed 6-Jun-2012 05:02
Al Mejida.
Tue 12-Jun-2012 20:59
Fri 6-Jul-2012 17:46
Thank you David McKenzie for your contribution to open source community !
I am just wondering what in your background that enabled the FSF to accept such worthless contribution ?
Member of what masonic lodge or what church or son of a war hero or billonarties you have to be so they accept that piece of crap ?
For reference:
yes command - otputs a line on tty until killed !
coded and added to Linux in 2009.
Fri 6-Jul-2012 17:48
Thank you David McKenzie for your contribution to open source community !
I am just wondering what in your background that enabled the FSF to accept such worthless contribution ?
Member of what masonic lodge or what church or son of a war hero or billonarties you have to be so they accept that piece of crap ?
For reference:
yes command - otputs a line on tty until killed !
coded and added to Linux in 2009.
interesing point although might be harsh on a boy who modified a hello world program and managed to add it to Linux.
Fri 6-Jul-2012 17:50
I disagree an entire source code of the yes in TARball may be a good example of how to add a new command to Linux, sort of like a new command template.
www.LinuxCAD.com
Linus Åkesson
Fri 6-Jul-2012 18:07
...
Member of what masonic lodge or what church or son of a war hero or billonarties you have to be so they accept that piece of crap ?
Your angry ignorance is amusing. Do you also consider echo or /dev/zero crap? Unix commands are simple by design, so that they can be combined easily. For instance, off the top of my head, here's a way to list the first 100 powers of two: (echo 1; yes 'p2*')|dc|head -n 100
Fri 6-Jul-2012 23:17
{
if ( argc < 2 )
{
printf( "\nNo program, prints line to tty until killed !... please put now my name in Linux.\n" );
exit(1);
}
while(1)
{
printf( argv[1] );
};
}
Fri 13-Jul-2012 19:37
Sat 14-Jul-2012 05:33
bash-3.00$ cat
SunStudio12u1-SunOS-SPARC-
Minal Patil
Can Web Master please delete this post so that the page would not be made so wide in some browser to be unreadable?
Thanks.
Linus Åkesson
Sat 14-Jul-2012 13:39
Thanks.
I've added some "max-width" attributes that should fix the problem. What browser do you use?
Sun 15-Jul-2012 00:18
lft wrote:
I've added some "max-width" attributes that should fix the problem. What browser do you use?
Thanks for being so responsive.
I did realize, later, that it was just elinks that laid out the page to be annoyingly wide.
$ elinks http://www.linusakesson.net/programming/tty/index.php
(Use "]" or mouse to click near the right border of the terminal to scroll right.)
I also found, later, that removing the posting containing a unusually long single-word helps, but a little scrolling left and right is still needed in elinks.
Since this is restricted to an uncommon browser, don't worry about it.
(I started using elinks on one computer due to the recent development on Linux desktop that resulted in poor support for older video cards where Firefox would freeze the entire desktop when rendering some common web content. elinks worked great for text content.)
By the way, thanks for the page. It was a great read.
Linus Åkesson
Sun 15-Jul-2012 22:29
lft wrote:
I've added some "max-width" attributes that should fix the problem. What browser do you use?
Thanks for being so responsive.
I did realize, later, that it was just elinks that laid out the page to be annoyingly wide.
I use elinks quite a lot myself, actually, for a fast, nonsense-reduced browsing experience. The page is not wider than the screen on my setup (elinks version 0.12pre5 with CSS enabled).
Wed 19-Sep-2012 23:01
The reason why the line discipline is inside the kernel, is to avoid context switches at the reception of each character (which in the early times of small core memories, would imply swap-outs and swap-ins!). So the line discipline keeps in a kernel buffer a line of input, and since it's simple enough to test for a specific byte and decrement a counter to implement the backspace "editing" (and a few other simple editing functions), it's done there.
The alternative, is to use the raw mode, where the characters are forwarded to the application as soon as they're received, which is needed for more sophisticated editors, like the (at the time) famously known Eight Megabytes And Constantly Swapping editor (emacs). And indeed, since emacs had to use this raw mode, which implies a context switch at the reception of each character typed, it was constantly swapping when the computers hadn't enough memory to keep emacs and all the other programs in core.
Thu 20-Sep-2012 04:54
Fri 28-Sep-2012 00:03
Thanks,
Val.
Fri 5-Oct-2012 19:38
too many Zs. write a shorter insult with proper spelling for us non-moron people
Sun 11-Nov-2012 21:09
Thu 29-Nov-2012 11:27
I have just a suggestion.
This article can be used as a first step by people (like me...) who don't have a deep knowledge on the topic,
so why not to add a "References" section to help going into more depth?
Cheers!
Sun 30-Dec-2012 10:26
Fri 4-Jan-2013 16:38
Wed 6-Feb-2013 02:27
A couple of clarifications that would be great:
1. It seems that there is a 1:1 correspondence between a session and the associated tty (bearing in mind that the associated tty may be "none") - is that true? In other words, can one session include processes with different ttys, and can processes in two different sessions be associated with the same tty? (and if so... what does that mean?!)
2. What are the exact rules for automatic raising of SIGHUP? It seems that this is raised by the TTY driver, right? Does the POSIX specification specify when this should happen and who should receive it, and does Linux follow that? I have a confusing situation involving ssh -t raising SIGHUP on exit, while logging out of an interactive ssh login apparently does not.
Thanks
D
Mon 11-Mar-2013 18:54
This is how I learned about things in the past, from people who knew their craft well. Compare this with how we do it today - don't think, google first, rummage through incoherent posts, forums, mailing lists and if you are patient enough might be able to put pieces together to get just the clues/pointers to the information you want! So much for the 'age of information'.
Keep up the good work!
Thanks.
- VJ
Tue 2-Apr-2013 13:01
ulzha
Sun 7-Apr-2013 16:59
I'm not writing an OS, but writing an improved screen or GUI terminal I do consider.
In particular I was interested in whether there was an API to tell foreground job's output and background job's output apart (e.g. associating a PID with each chunk output) to highlight them understandably or something. Now I figure that I just might be able to implement that by wisely trapping SIGTTOUs perhaps...
Sat 18-May-2013 13:57
Well, it is the age of information. Noone said it was the age of wisdom.
Sat 18-May-2013 14:08
Thank you David McKenzie for your contribution to open source community !
I am just wondering what in your background that enabled the FSF to accept such worthless contribution ?
Member of what masonic lodge or what church or son of a war hero or billonarties you have to be so they accept that piece of crap ?
For reference:
yes command - otputs a line on tty until killed !
coded and added to Linux in 2009.
Actually, "yes", which is part of GNU coreutils, has been around since, like forever, being an implementation of the same-named Unix command.
David MacKenzie is the author of many of coreutils' commands, including chgrp, chmod, chown, date, dirname, expand, fold, ginstall, groups, head, mkdir, mkfifo, mknod, nice, printenv, printf, rmdir, stty, su, tty, uname, unexpand, and obviously yes; and is co-author of many others. But he is probably best known for autotools, which is one of the most central pieces of free software, as any distribution maintainer could tell you.
Now, what have YOU done for GNU or Linux or free software?
Sat 24-Aug-2013 23:48
/radiantx
Fri 6-Sep-2013 14:10
Sun 15-Sep-2013 22:58
Thu 10-Oct-2013 07:42
Wed 11-Dec-2013 15:19
Fri 13-Dec-2013 16:13
Fri 27-Dec-2013 16:55
Have you tried ls /dev/tty.* to get a listing of connected devices? On my Mac OS X this cues me into which tty device to use. I'm running a DEC Writer III. :)
Tue 11-Feb-2014 20:38
You work for Microsoft?
Wed 12-Feb-2014 03:14
Fri 14-Feb-2014 09:32
The Hellschreiber device is not a teletype, it's more of a facsimile machine. You pressed a letter, and a _bitmap_ of the letter was transmitted (twice to account for mechanical asynchrony). On the receiving side, marks and spaces were literally penned onto the paper, creating two copies of the text, one atop the other. Due to said asynchrony, it was often skewed, but because two copies were printed, nonetheless legible.
This is a very, very different mode of operation from the teletypes described above.
Fri 14-Feb-2014 09:45
I don't know of the history of teletypes in Germany, but the Teletype Model 15 was first produced in 1930 and was in wide use before and after World War II. Both in military and civilian contexts.
The Model 15 wasn't the first model produced by the Teletype corporation, but it was probably the most widely used pre-war model. It might have been the most widely used model, period.
Like I said, I don't really know anything about German teletypes, but looking at the Wikipedia page for Hellschreiber, that device is quite different than the Teletype corporation's devices. It looks like the Hellschrieber sends pixels and might actually be more similar to FAX machines than Teletype devices.
Mon 17-Feb-2014 08:42
Thu 27-Feb-2014 08:55
Every once in a while I get up the ambition to complain about the width of text on a web page, and you're the lucky winner today--sorry ;-)
This could be a good article--from the looks of it, it probably is--but why is it (and so many other web pages today) so wide?
Checking one line at random, it is 130 characters wide:
echo "Meanwhile, however, the computers — still quite large and primitive, but able to multitask — were becoming powerful enough to" | wc
1 20 130
Oh, and I'm ignoring the stuff in the left hand panel / column--I simply horizontally scroll so that panel is not visible.
.....
You mean you aren't browsing this page with a teletype?
Thu 10-Apr-2014 14:05
I can't understand? The process will not blocked when TTY is stopped by flow control(ctrl+S), the foreground process will continue running. The only difference is I can't see the display until I type ctrl+Q again.
Thanks for you article
nyu
Thu 10-Jul-2014 13:03
I can't understand? The process will not blocked when TTY is stopped by flow control(ctrl+S), the foreground process will continue running. The only difference is I can't see the display until I type ctrl+Q again.
You're right Nyu... and this running process may be blocked when the TTY kernel buffer is full of non-displayed characters, if it outputs too much on stdout/stderr.
I guess the author has taken a shortcut when writing this, as the flow control stop is often used to block a too verbose process and to be able to read few lines before let it go on again.
Yves
Mon 14-Jul-2014 13:16
Thu 24-Jul-2014 11:39
I'm struggling with RS485 communication:
Is it possible to configure a tty to automatically raise the RTS line before sending and lower the RTS line after sending?
Thank you for your input,
Helmut
Mon 28-Jul-2014 13:13
Tue 29-Jul-2014 00:07
Tue 5-Aug-2014 11:29
Kind regards,
Christian from Germany
Tue 2-Sep-2014 18:01
seems so, just checked the manuals online. http://www.vt100.net/docs/
do you perhaps know which terminal introduced color attributes for escape sequences?
Fri 5-Sep-2014 01:13
Sat 13-Sep-2014 14:33
Not just pipelines, every command is a job in shell's parlance. Job is a userspace thing, only maintained by shell, not kernel.
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Commands
Niz
Wed 24-Sep-2014 14:34
Sun 12-Oct-2014 19:04
Fri 14-Nov-2014 02:31
-pf
Sun 16-Nov-2014 03:37
And now, I know the meaning of "tty" and "pty"!
Maya2003
Wed 3-Dec-2014 16:42
Wed 14-Jan-2015 21:09
Thanks a lot!
Mon 9-Feb-2015 03:38
Sun 15-Feb-2015 23:47
Sun 15-Feb-2015 23:47
Zach Dennis
Mon 9-Mar-2015 00:07
The O'Reilly book titled "Termcap & TermInfo" should get you started: http://www.amazon.com/termcap-terminfo-OReilly-Nutshell-Linda/dp/0937175226
Sun 12-Apr-2015 00:14
thank you so very much.
Wed 15-Apr-2015 01:21
So I have a simple script (and I'm not sure I have the stty settings right), that should send "tx c" to the serial port. However, the best I can tell using minicom, if I perform the following from the command line:
echo tx c > /dev/ttyO1
the serial device receives:
tx.{
echo aaa > /dev/ttyO1 echos aay
echo bbbbb > /dev/ttyO1 echos bbbbz
echo abcdefghijklmnop > /dev/ttyO1 echos abeefgkijkmmnoz
WHAT am I missing?
Tue 21-Apr-2015 18:45
Chakri
Fri 8-May-2015 14:00
Sat 25-Jul-2015 20:08
Thu 30-Jul-2015 06:41
Sat 15-Aug-2015 21:45
Sun 16-Aug-2015 05:57
Thank you David McKenzie for your contribution to open source community !
I am just wondering what in your background that enabled the FSF to accept such worthless contribution ?
Member of what masonic lodge or what church or son of a war hero or billonarties you have to be so they accept that piece of crap ?
For reference:
yes command - otputs a line on tty until killed !
coded and added to Linux in 2009.
The yes command appeared in Version 7 AT&T UNIX.
int
main(int argc, char *argv[])
{
if (argc > 1)
for (;;)
puts(argv[1]);
else
for (;;)
puts("y");
}
David Lindsay
Tue 18-Aug-2015 18:55
http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN5/0036____.HTM
Also, the following Github Gist is updated extremely frequently (6 days ago, as I type this); it tracks terminal support for 24-bit color, a fairly new capability that's slowly gaining traction. You should be able to just expect it to be available 3-5 years from now; terminals in hyper-current distros like Arch likely have the support already.
https://gist.github.com/XVilka/8346728
Tue 22-Sep-2015 06:41
Mon 30-Nov-2015 10:35
Fri 4-Dec-2015 09:14
It might be worth mentioning that UARTs/serial ports have control lines to block transmission when the received data can't be processed as fast as it's received.
This way the UART itself would stop transmitting and the whole process was handled in hardware.
The sending process would have to wait (be blocked) for the UART to transmit it's data anyway, as the hardware would mostly be slower than the software anyway.
However when modems came in to play, the terminals UART and the hosts UART were no longer directly wired to each other and modems would only transmit data and no control lines between them. This situation required another method of flow control that would have to be transmitted in-band with the data. So software flow control via device control characters was invented.
Thu 7-Jan-2016 13:45
Tue 12-Jan-2016 17:07
Fri 5-Feb-2016 15:34
Sat 20-Feb-2016 02:55
Cheers
Thu 10-Mar-2016 02:06
Linus Åkesson
Wed 30-Mar-2016 00:35
Hi! That is not handled by the TTY layer, it is done by the terminal emulator itself. Whenever something scrolls off-screen, it is appended to a scrollback buffer, which you can then view using GUI controls or keyboard shortcuts.
Thu 31-Mar-2016 00:02
Sat 9-Apr-2016 03:04
Sun 10-Apr-2016 05:34
-- kc
Luis Colorado
Thu 14-Apr-2016 16:19
-- kc
This requirement has been dropped from linux kernel and now linux allows you to fix terminal settings from a previous shell command without losing those settings because of a last close issue.
Fri 22-Apr-2016 06:21
Mon 16-May-2016 23:57
Thu 23-Jun-2016 22:00
Fri 15-Jul-2016 23:14
Sat 16-Jul-2016 21:19
Sat 23-Jul-2016 16:39
I've interfaced bluetooth to uart.
The data coming from bluetooth is received and can be monitored on ttyS0.
Can someone tell me how to copy that data.
I want to paste it in a text file
Tue 30-Aug-2016 00:34
.... cut ....
For reference:
yes command - otputs a line on tty until killed !
coded and added to Linux in 2009.
Interesting! I remember I made a joke with yes program to my friend in 1996 by using Slackware Linux I.e. Linux kernel so new.
Tue 30-Aug-2016 01:03
So I have a simple script (and I'm not sure I have the stty settings right), that should send "tx c" to the serial port. However, the best I can tell using minicom, if I perform the following from the command line:
echo tx c > /dev/ttyO1
the serial device receives:
tx.{
echo aaa > /dev/ttyO1 echos aay
echo bbbbb > /dev/ttyO1 echos bbbbz
echo abcdefghijklmnop > /dev/ttyO1 echos abeefgkijkmmnoz
WHAT am I missing?
Not sure about your system but in my old linux systems with serial port, device was ttyS01 but not tty01.
Tue 30-Aug-2016 01:11
Shift+page up/down
This will do the job both in fyi terminal emulators and the ones on TTYs (ctrl+alt+F1, etc.).
Tue 30-Aug-2016 01:23
So I have a simple script (and I'm not sure I have the stty settings right), that should send "tx c" to the serial port. However, the best I can tell using minicom, if I perform the following from the command line:
echo tx c > /dev/ttyO1
the serial device receives:
tx.{
echo aaa > /dev/ttyO1 echos aay
echo bbbbb > /dev/ttyO1 echos bbbbz
echo abcdefghijklmnop > /dev/ttyO1 echos abeefgkijkmmnoz
WHAT am I missing?
Not sure about your system but in my old linux systems with serial port, device was ttyS01 but not tty01.
It seems ttyO1 works for you.
Maybe outrun a CR and LF at the end of the echoed words will help.
Indeed CR may not be needed.
Try this:
echo bbbbb\n\r > /dev/ttyO1
Hope it works *fingers crossed* :)
Tue 30-Aug-2016 01:29
Fantastic job Linus. Thank you so much!
Bedri Özgür Güler
Thu 6-Oct-2016 21:39
Whilst I agree with you entirely, this article wraps just as you request.
Of course, it may have been altered in the many years since you wrote your comment :-) but credit where credit is due!
Sun 20-Nov-2016 22:14
Great article.
Would be awesome something like that about handling keycodes(infocmp & friends).
Mon 12-Dec-2016 00:47
Can you tell me when the /dev/ttyXXX or /dev/pts/X are added in the /dev directory ?
Initially, I thought that each program had its own /dev/ttyXXX device. When is the kernel adding a new /dev/ttyXXX device ?
Let say that I add the following lines in /etc/rc.local
# Start these program during the init.
/home/user/prog1 &
/home/user/prog2 &
/home/user/prog3 &
Will it create one or three new /dev/ttyXXX device ?
(or will it reuse another one that is already present?)
Thanks for this article.