使用共享内存实现管道

时间:2013-01-18 13:47:38

标签: c shared-libraries pipe shared-memory

我正在使用共享内存实现管道。 我应该只编写和触摸库,而不是main()

我遇到了一个问题:

可以说这是使用我的库main()的某些用户的shared_memory_pipe.h

#include "shared_memory_pipe.h"

int main() {
    int fd[2];
    shared_memory_pipe(fd);
    if (fork()) {
        while(1) {}
    }
    shared_memory_close(fd[0]);
    shared_memory_close(fd[1]);
}

在这个例子中,我们看到孩子关闭了他的两个fd,但是父亲被困在一个无限循环中,并且永远不会关闭他的fd。在这种情况下,我的管道应该仍然存在(与所有写入fd关闭,或者所有读取fd都关闭,或者所有都关闭,因此管道应该死亡的情况相比)。

正如我之前所说,我只写了库,(shared_memory_pipe.h)。 那么,在图书馆内,我怎么知道是否已经制作了fork()

我怎么知道还有另一个进程有一个读/写端到我的共享内存管道,所以我会知道关闭/不关闭我的共享内存管道?

我听到一个关于命令的事情,他知道有一个fork()或类似的东西,但我找不到它,我也不知道。

非常感谢! 请询问您是否需要更多信息。

2 个答案:

答案 0 :(得分:0)

在任何分叉之前,父级可以将getpid()的结果存储到全局pid_t pid_parent

在稍后的时间点,该过程可以再次使用pid_parentgetpid()进行测试。

如果getpid()的结果与pid_parent的结果不同,则该进程至少有一个fork()远离父级。

答案 1 :(得分:0)

代码的哪一部分负责关闭fd?

如果是用户代码,则fork()不是您的问题。毕竟,调用者可以对另一个程序(匿名管道的常见用法)执行execve,因此您的库代码现在已经从进程中消失,即使fd仍处于打开状态,因此您无法使用可以处理。

如果您有一个用于关闭FD的库API,那么您就可以做到。执行程序无论如何都不会调用你的库。