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'
)。
我发现了函数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'
)。