了解read()和write()的行为
收藏

嗨,我是一名学生,刚开始学习低级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”后输入“as df”时,它会执行“df”命令。
我想知道为什么当我们给一个大小为2的字符串分配超过2个字符时,它没有给出分段错误。为什么它要将输入的rest(2个字符之后)作为命令执行,而不是仅将其作为输出?
同时读取read()的手册页,我发现read()应该会给出默认错误,但它不会。
我在用Linux。


最佳答案:

你的read特别声明它只需要两个字符,所以就这样。您没有将任何字符放入st区域,因此不会出现任何分段冲突。
至于为什么它要执行df部分,这实际上不会发生在我的直接系统上,因为程序一直挂起直到按下enter键,而且程序的i/o似乎正在吸收额外的。但这个即时系统是cygwin—请参阅下面的更新,了解“真实”unix机器上的行为。
只有当EFAULT在您的地址空间之外或在其他方面无效时,您才会得到st。这里不是这样的。
更新:
在Ubuntu9上尝试这个,我发现行为和你的一样。当我提供字符asls时,程序输出as然后进行目录列表
这意味着您的程序只读取这两个字符,剩下的留给“下一个”程序读取,即shell。
请确保不要尝试输入:

asrm -rf /

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

    公众号
    关注公众号订阅更多技术干货!