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