read() 的奇怪行为

Strange behavior with read()

我发现了函数read(),但我不是很明白。 这是我的代码:

#include <unistd.h>
#include <stdio.h>

int     main(void)
{
    char array[10];
    int  ret;

    printf("read : ");
    fflush(stdout);

    array[sizeof(array) - 1] = '[=10=]';
    ret = read(STDIN_FILENO, array, sizeof(array) - 1);

    printf("array = %s\n", array);
    printf("characters read = %d\n", ret);

    //getchar();

    return (0);                 
}

这里是 运行 程序的一个例子:

$> ./a.out
read : hi guys how are you
array = hi guys h
characters read = 9
$> ow are you
zsh: command not found: ow
$>

为什么程序结束后会启动shell命令? 我注意到如果我取消注释 getchar() 行,这种奇怪的行为就会消失。如果有人有想法,我想了解发生了什么:)

您输入了大约 20 个字符,但您使用 read() 只读出了 9 个字符。之后的所有内容都留在终端驱动程序的输入缓冲区中。所以当 shell 在程序退出后调用 read() 时,它得到了该行的其余部分,并尝试将其作为命令执行。

为防止出现这种情况,您应该继续阅读直到读到行尾。

您对 read 的调用正在朗读您键入内容的前 9 个字符。任何其他内容都将留在输入缓冲区中,以便当您程序退出时,您的 shell 将改为读取它。

您应该检查 read 的 return 值,以便您知道已读取了多少,因为不能保证它是您要求的数量以及 [=21] 的值=]ed 用于指示错误。

读入的字符串也不会以 null 结尾,因此您还应该使用 return 值(如果为正)放入 NUL 字符,以便您的字符串有效。

如果您想阅读整行,则需要放入一个循环并确定何时有行尾字符(很可能 '\n')。