shell和C程序的关系

Relationship between the shell and a C program

我编写了以下代码作为 K&R 第一章练习的一部分。该代码按预期替换了制表符和反斜杠,但没有用 \b 替换退格符。这是代码:

#include <stdio.h>


int main(void)
{
    int c;

    while((c = getchar()) != EOF)
    {
        if (c == '\t')
        {
            putchar('\');
            putchar('t');
        }

        if (c == '\b')
        {
            //putchar('\');
            //putchar('b');
            printf("\b");
        }

        if (c == '\')
        {
            putchar('\');
            putchar('\');
        }

        if (c != '\t' && c != '\b' && c != '\')
        {
            putchar(c);
        }
    }


    return 0;
}

我查看了 Stack Overflow。 this 问题的答案讨论了 shell 使用退格键,结果是我编写的代码从来没有看到退格键。这让我想到了我的问题:我在键盘上提供的输入会发生什么变化?我假设这成为标准输入流的一部分。不过,很明显,并非我输入的所有字符都会出现在我的代码中。有人可以解释一下我的击键和我的代码对该输入的处理之间发生了什么处理吗?另外,在这个处理发生之前,我的代码有没有办法读取标准输入缓冲区?

我希望这些问题是有道理的。我花了一段时间才弄清楚我想问什么,我不确定我是否完全弄清楚了。

getchar() 正在从交互式控制台读取时,该函数不会 return 直到 您按下 ENTER 键之后。然后它将 return 输入第一个字符,并立即为您输入的每个后续字符 return 直到换行符。

如果您在按 ENTER 之前按了退格键、删除键或箭头键,终端会处理这些击键,并且只会在您按 ENTER 时发送 "final result"。

如果您一直在从重定向文件中读取(即您将程序称为 ./myprog < input_file)或来自另一个程序的管道输出(即 ./otherprog | ./myprog),那么 getchar 会return 立即查看每个字符,您会看到所有内容,包括控制字符和单独的 UTF-8 字节。

那是因为退格字符在标准输入中永远不会达到 getchar。当您键入退格键时,它只会取消您刚刚键入的字符。

不过,如果您设法创建一个带有退格字符的文本文件并将其提供给您的程序,那么该文件就可以运行。