【发布时间】:2014-12-12 09:45:24
【问题描述】:
我需要自己实现一个管道,它将具有pipe()、read()、write() 和 close() 的常规管道式功能。管道旨在用作父进程和子进程之间的通信通道,这意味着程序将使用fork(),可能不止一次。
我的想法是使用 pipe() 函数中的 malloc 来实现它,该函数将在 close() 函数中释放,但是当 fork 命令发生时,我最终会得到多个进程持有一个文件描述符到我的管道,这是我无法弄清楚的部分:
我怎么知道fork() 被调用了多少次以及有多少进程可以访问我的管道?
如何防止关闭其对管道一端的访问的进程为所有其他进程关闭它?如何确保关闭管道的最后一个进程将释放其内存?
更新
实际上它是用来处理文件描述符的,进程不管理这个内存,他们只能访问它,我需要一种方法来防止进程关闭一端在它之前关闭它被所有其他人关闭,并确保一旦所有端都关闭,内存就会被释放。
【问题讨论】:
-
使用 fork,您可以获得完全分离的进程,每个进程都有自己的内存。因此,仅使用 malloc 的幼稚方法是行不通的 - 您应该在 每个 分叉进程中释放内存
-
你是在内核内部做这个,还是在普通用户空间代码中模拟它?我假设是后者,但这会使您的生活复杂化,尤其是因为其中一个子进程本身可能会分叉,并且很难追踪到它。在可以正确完成此类跟踪的内核中具有优势。
-
如果你真的想在不使用内核管道的情况下实现管道,我会看看例如shared memory segments,请参阅教程 here。但显然这不是一个完整的自己动手实现
-
内存被不同的散文分配,父子俩都只是获得了对该内存的引用。
-
@petric,我认为如果你能给出你的 original 问题的完整描述会很有用。正如您所想象的那样,用户空间管道在用户空间中实际上是不可能的(例如,自定义文件描述符需要编写内核空间模块)。
标签: c linux pipe fork file-descriptor