【问题标题】:Different Seek Pointer for read\write用于读\写的不同搜索指针
【发布时间】: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 个字节。

标签: c linux file inode


【解决方案1】:

两个进程都使用相同的文件描述(即同一个打开的文件)。

他们访问的是同一个文件指针,因为它是同一个文件描述的一部分。当其中一个写入一些字符时,所有的文件指针都会前进,因为它是同一个文件指针。

您可以通过调用lseek(fd, 0, SEEK_CUR) 来获取文件指针。如果你在启动子程序之前打印文件指针,等待它之后,你应该看到它已经改变了。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2017-03-31
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多