read()的奇怪行为

时间:2017-05-24 16:48:24

标签: c posix

我发现了函数read(),但我并不了解所有内容。 这是我的代码:

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

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

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

    array[sizeof(array) - 1] = '\0';
    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()行,这种奇怪的行为就会消失。如果有人有想法,我想了解发生了什么:)

2 个答案:

答案 0 :(得分:3)

您对read的来电正在读取您所输入内容的前9个字符。其他任何东西都会留在输入缓冲区中,这样当你编程退出时,shell会改为读取它。

您应该检查read的返回值,以便了解已阅读的内容,因为它不能保证它是您要求的金额,并且还会使用返回的值表示错误。

读入的字符串也不会以空值终止,因此您还应该使用返回值(如果为正)将NUL字符放入,以使您的字符串有效。

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

答案 1 :(得分:2)

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

为了防止这种情况发生,你应该继续阅读,直到你到达终点。