【发布时间】:2021-11-28 07:57:10
【问题描述】:
我试图了解当父进程打开一个新文件然后使用fork() 创建一个新子进程时,查找指针机制是如何工作的。
假设我有以下代码:
int main(){
int fd = open("myFile.txt", O_RDWR | O_CREAT)
if(fork() == 0){
write(fd,"stack overflow", 16);
close(fd);
}
else{
wait(NULL);
char buff[17];
read(fd, &buff, 16);
printf("%s", buff);
}
}
我没有打印到标准输出,但我真的不明白为什么会这样。如果有一个不同的用于读写的查找指针,那么运行此代码会导致将“堆栈溢出”打印到标准输出,那不是更聪明吗?
显然不是,希望得到解释
【问题讨论】:
-
“会不会更聪明”。据WHO称?您发现的行为是正确的,正如fork 所定义的那样:“子进程继承父进程的一组打开文件描述符的副本。子进程中的每个文件描述符都引用相同的打开文件描述(参见 open(2) ) 作为父级中对应的文件描述符。这意味着两个文件描述符共享打开文件状态标志、文件偏移量和信号驱动的 I/O 属性"
-
一个大问题是您的代码没有检查
read返回的内容。这可能使您尝试打印数组buff中的未初始化 数据,这可能导致未定义行为。另一个问题是,如果read成功,那么您不添加空终止符,这意味着您再次 具有未定义的行为,因为printf函数在查找它时可能会超出范围。此外,您不应在read调用中使用指向运算符,而应使用普通的buff(它将衰减指向指向数组第一个元素的指针)。 -
没有两个程序步入同一个流 - 赫拉克利特
-
write(fd,"stack overflow", 16);尝试从仅包含 15 个字节的数组中写入 16 个字节。