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

标签 c linux

你好,我是一名学生,刚开始学习低级 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/

相关文章:

c - 如何在 C 编程语言中定义固定大小的数据类型(以位为单位)

linux - Logrotate cronjob 未运行

linux - shell 脚本中的 tcpdump 没有捕获任何内容

linux - 在 Shell 中读取多行用户输入

android - 客户的 Logo 作为默认启动动画

c - 自由开关ESL "cannot find -lesl"

c - 将项目添加到空链表 C

c - 非静态变量初始化

android - 来自android内核的同时触摸事件

linux - 如何使用 grep 查找 '../images/'