Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Are you literally "ending a file" by inputting this escape sequence, i.e. is the interactive shell session is seen as a real file stream by the shell, like any other file stream? If so, which file?

Or, is the Ctrl+D signal just a placeholder which means "the user has finished providing input and you may terminate"?

share|improve this question
    
2  
FYI, in bash you can do set -o ignoreeof to change that behavior. –  Keith Jan 21 at 11:15

2 Answers 2

up vote 6 down vote accepted

The ^D character (aka \04 or 0x4) is the default value for the eof special control character parameter of the terminal or pseudo-terminal driver in the kernel. That's the c_cc[VEOF] of the termios structure passed to the TCSETS/TCGETS ioctl one issues to the terminal device to affect the driver behaviour.

The typical command that sends those ioctls is the stty command.

To retrieve all the parameters:

$ stty -a
speed 38400 baud; rows 58; columns 191; line = 0;
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

That eof parameter is only relevant when the terminal is in icanon mode.

In that mode, the terminal driver (not the terminal emulator) implements a very simple line editor, where you can type Backspace to erase a character, Ctrl-U to erase the whole line... When an application reads from the terminal, it sees nothing until you press Return at which point the read() returns the full line including the last CR or LF character (by default the terminal driver also translates the CR to LF).

Now, if you want to send what you typed so far without pressing Enter, that's where you can enter the eof character. Upon receiving that character from the terminal emulator, the terminal driver submits the current content of the line, so that the application doing the read on it will receive it as is (and it won't include a trailing LF or CR character).

Now, if the current line was empty, and provided the application will have fully read the previously entered lines, the read will return 0 character.

That signifies end of file to the application (when you read from a file, you read until there's nothing more to be read). That's why it's called the eof character, because sending it causes the application to see that no more input is available.

Now, modern shells, at their prompt do not set the terminal in icanon mode because they implement their own line editor which is much more advanced than the terminal driver builtin one. However in their own line editor, to avoid confusing the users, they give the ^D character (or whatever the terminal's eof setting is) the same meaning (to signify eof).

share|improve this answer

CTRL_D is just a signal saying that this is the end of a text stream. You do not end a file with it, you end your input stream by typing it. Also CTRL_D does not stand for any character or byte as you can find out with the tool hexdump:

# cat >test.txt
asdf# hexdump -C test.txt 
00000000  61 73 64 66                                       |asdf|
00000004
# ll test.txt 
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt
share|improve this answer
1  
And the reason that it ends the shell is that the shell is basically a process that accepts input and does stuff with it. When you tell it no more input is going to be coming, there's nothing more for the shell to do. –  Jenny D Jan 21 at 11:04
    
I realize that the EOF sequence is not contained by, say, a text file, and is generated by the OS to report that there is no more data to read. I think what I am really asking is if the interactive terminal session is seen as a real file stream by the shell, like any other file stream. –  Geeb Jan 21 at 11:25
    
Just edited the original question to clarify. –  Geeb Jan 21 at 11:32
1  
yes, the stream that goes to bash is an input stream like any other. CTRL_D signals that the input stream is at its end and bash can quit. –  Thorsten Staerk Jan 21 at 11:42

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.