【问题标题】:How are kernel states duplicated on a fork?内核状态如何在 fork 上复制?
【发布时间】:2018-07-26 08:37:31
【问题描述】:

假设我在 Linux 中有一个字符设备驱动程序,它在内核中分配一些内存来针对每个打开的文件描述符存储一些状态。

某些进程在驱动程序上打开一个 fd,并且通过一些ioctls,该进程还为该状态提供了初始化参数。

现在进程分叉了。还将为子进程创建所有文件描述符。

如何复制 fd 特定状态? AFAIK do_fork 只复制内核知道的数据结构。

子进程是否必须重新初始化 fd,否则最终会与父进程共享状态?

【问题讨论】:

  • 我的理解是正确的,您存储在内核中的状态是在您通过驱动程序中的 kmalloc 在内核中获得的一些内存中?
  • @yashC 状态存储在一些kmalloc'd 内存中。
  • 那么,你的'状态'存储在 kmalloced 内存中的内核行为将与其他 kmalloced 内存相同。即孩子将获得叉子未触及的数据。
  • @yashC 但现在孩子和父母都有相同的指针指向相同的 kmalloc 内存。这实质上意味着他们将共享状态,这可能不是预期的行为。
  • 对谁的预期行为?你还是内核作者?

标签: linux-kernel fork linux-device-driver


【解决方案1】:

forkdup 上没有重复的打开文件描述状态。所有这些状态都将在父母和孩子之间共享。

【讨论】:

  • 但这似乎不像大多数驱动程序那样正常工作?好的,有没有办法明确地告诉司机关于前叉的事情?所以它可以复制给定这个信号的状态?
  • 不,他们没有。你能举个例子吗?
  • @Ajay 尝试编写一个打开文件然后分叉的程序。每个进程等待一些随机时间,然后从文件中读取一行并将其打印出来。您将看到文件位置在两个进程之间共享。换句话说:fork() 复制文件描述符,但它们仍然引用相同的共享打开文件描述。
猜你喜欢
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2012-11-25
相关资源
最近更新 更多