0

我正在使用共享内存实现管道。我应该只写和触摸图书馆,而不是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()已经制作了a?

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

我听说过一个命令,他知道有一个fork()或类似的东西,但我没有找到它,我不知道它。

提前谢谢!请询问您是否需要更多信息。

4

2 回答 2

0

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

比在以后的时间点,该过程不能再次测试pid_parent使用getpid()

如果 thangetpid()的结果与进程不同,pid_parent则距父进程至少有一个 fork() 。

于 2013-01-18T13:52:41.960 回答
0

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

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

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

于 2013-01-18T14:30:17.917 回答