什么是ubuntu中的EOF以及关于Kernighan和Ritchie的EOF

时间:2013-11-19 15:10:35

标签: c ubuntu kernighan-and-ritchie

我已经开始学习C了,我也开始使用Ubuntu了。我正在通过终端在vim中编写代码。我一直在学习Kernighan和Ritchie。这是代码 -

#include <stdio.h>

int main()
{
 int c;
 while ( (c = getchar()) != EOF)
 putchar(c);
 return 0;
 }

现在,我的问题是: -

  1. 如果我按下ctrl + z,程序会停止,但如果我按下ctrl + D它也会终止,当我在网上看到它时说ctrl + z是windows中的EOF和linux中的ctrl + d。这是否意味着它们都是Linux中的EOF?如果是这样,那么其他EOF是什么?
  2. 在本书的第一章中可以提出如此复杂的问题吗?或者我应该只是阅读它,这些想法会在我阅读时被清除?

3 个答案:

答案 0 :(得分:13)

正在发生两件不同的事情。

在Windows中键入Control-Z或在Linux中键入Control-D会触发文件结束条件,并导致getchar()返回值EOF

在Linux中键入Control-Z会有所不同:它暂停程序的执行。键入Control-Z后,如果键入jobs命令,它将显示已暂停的程序。键入fg将使其恢复并继续接受输入 - 直到您通过键入Control-D发出文件结束信号。如果您的程序生成了一些输出,那将更容易看到。

Control-Z的行为与程序的编写方式无关; Control-Z将暂停(几乎)任何正在运行的程序,无论它是否用C语言编写,以及它是否在等待输入。这种行为特定于Linux和其他类Unix操作系统。

你可能永远不会用完doubts and questions;我当然没有。

答案 1 :(得分:1)

  1. Windows中的CTRL + Z和Linux中的CTRL + D 发送 EOF值到stdin,EOF本身是实现定义的。只有CTRL + D在linux中工作。您可以像printf("%d", EOF);一样打印它以查看其数值。

  2. 是的,怀疑和想法总是有用的=)

答案 2 :(得分:0)

C中的EOF是一个条件(“文件结束”),而不是一个告诉你已经到达终点的特殊字符 - 没有更多的输入。这个条件通过各种函数指示给你,比如getchar()返回特殊值EOF.EOF只是一个值(通常是一个#defined为-1的宏),否则不会出现在这些函数读取的数据中。

如果从文件或管道中读取,则当getchar()返回EOF时,您知道已到达该文件的末尾。 getchar()从stdin读取。通过将程序作为echo hello | ./theprogram

运行,可以将管道连接到stdin而不是控制台

如果您从终端/控制台读取输入,事情会更复杂。在某些系统中,huge layers涉及将键盘输入引入程序。

但是短版本是在某些系统上,当你点击CTRL + D(或其他人的CTRL + Z)键组合时,它能够通知你的程序输入结束,这使得getchar()返回EOF。

对于linux上的CTRL + z,这将暂停(暂停,但不终止)当前前台进程。