gpt4 book ai didi

c - 管道的 self 实现,如何知道有多少进程对我的管道有文件描述符?

转载 作者:IT王子 更新时间:2023-10-29 01:08:46 27 4
gpt4 key购买 nike

我需要自己实现一个管道,它将具有 pipe() 的常规管道功能, read() , write()close() .该管道旨在用作父进程与其子进程之间的通信 channel ,这意味着该程序将使用 fork() ,可能不止一次。

我的想法是在 pipe() 函数中使用 malloc 来实现它,它将在 close() 函数中被释放,但是当 fork 命令发生时我最终会有多个进程将文件描述符保存到我的管道,这是我无法弄清楚的部分:

我怎么知道 fork() 被调用了多少次以及有多少进程访问了我的管道?我如何防止关闭其对管道一端的访问的进程为所有其他管道关闭它?我如何确保关闭管道的最后一个进程将释放其内存?

Update

实际上它是用来处理文件描述符的,进程不管理这 block 内存,它们只能访问它,我需要一种方法来防止进程在它之前关闭它被所有其他人关闭,并确保一旦所有结束都关闭,内存就会被释放。

最佳答案

我想你想做的是实现类似pipe()的东西,但实际上没有使用pipe()(甚至FD),而是使用内存.

当程序执行 fork() 时,其 FD 对子进程和父进程都可用。因此,使用 pipe(), child 可以写,而 parent 可以读(反之亦然)。但是, child 继承了 parent 内存的写时复制副本。因此,子进程执行的任何写入都不会被父进程看到,反之亦然。另一方面,如果您使用线程,则内存映射是真正共享的。

您正在尝试做的是一种 IPC(进程间通信)形式。如果您不想使用内存,则需要一种特殊类型的内存。一种方法是使用 shmgetshmctl 等 - 有示例 here .

但是,您必须自己管理内存分配,而不是使用 malloc()free()malloc()free() 操作在堆上,不会使用共享内存段。

为了完整起见,从技术上讲,您的问题的答案是父项和所有子项必须各自释放父项在 fork() 之前所做的任何分配,因为它们不仅有分配内存的副本,还有内存分配控制结构的副本。但是,它们实际上每个都有包含相同数据的不同分配(通过写时复制实现)。

关于c - 管道的 self 实现,如何知道有多少进程对我的管道有文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com