gpt4 book ai didi

c - 了解 read() 和 write() 的行为

转载 作者:可可西里 更新时间:2023-11-01 11:47:56 24 4
gpt4 key购买 nike

你好,我是一名学生,刚开始学习低级 C 编程。我试图通过这个程序理解 read()write() 方法。

#include <unistd.h>
#include <stdlib.h>
main()
{
char *st;
st=calloc(sizeof(char),2);//allocate memory for 2 char
read(0,st,2);
write(1,st,2);
}

我原以为当我尝试输入超过 2 个输入字符时它会出现段错误。但是当我执行程序并在将“as”作为输出输入后输入“asdf”时,它会执行“df”命令。

我想知道为什么当我们将超过 2 个字符分配给大小为 2 的字符串时它不会给出段错误。为什么它执行输入的剩余(在 2 个字符之后)作为命令而不是将其作为输出只是?

我还阅读了 read() 的手册页,我发现 read() 应该给出 EFAULT 错误,但它没有。

我正在使用 linux。

最佳答案

您的 read 明确指出它只需要两个字符,所以它就得到了。您没有将更多字符放入st 区域,这样您就不会遇到任何分段冲突。

至于为什么它正在执行 df 部分,这实际上并没有发生在我的直接系统上,因为程序会一直挂起直到按下 ENTER,而且程序的 I/O 似乎正在吸收额外的。但直接的系统是 Cygwin - 请参阅下面的更新以了解“真实”UNIX 机器上的行为。

如果 st 超出您的地址空间或无效,您只会得到 EFAULT。这里不是这种情况。


更新:

在 Ubuntu 9 上尝试这个,我发现行为与你的相同。当我提供字符 asls 时,程序输出 as 然后执行目录列表

这意味着您的程序只读取这两个字符,其余的留给“下一个”程序读取,也就是 shell。

请确保您不要尝试输入:

asrm -rf /

(不,说真的,不要那样做)。

关于c - 了解 read() 和 write() 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2971986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com