我正在使用共享内存实现管道。
我应该只编写和触摸库,而不是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()
或类似的东西,但我找不到它,我也不知道。
非常感谢! 请询问您是否需要更多信息。
答案 0 :(得分:0)
在任何分叉之前,父级可以将getpid()
的结果存储到全局pid_t pid_parent
。
在稍后的时间点,该过程可以再次使用pid_parent
对getpid()
进行测试。
如果getpid()
的结果与pid_parent
的结果不同,则该进程至少有一个fork()远离父级。
答案 1 :(得分:0)
代码的哪一部分负责关闭fd?
如果是用户代码,则fork()
不是您的问题。毕竟,调用者可以对另一个程序(匿名管道的常见用法)执行execve
,因此您的库代码现在已经从进程中消失,即使fd仍处于打开状态,因此您无法使用可以处理。
如果您有一个用于关闭FD的库API,那么您就可以做到。执行程序无论如何都不会调用你的库。