2013-01-18 73 views
0

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

我遇到一个问题:

比方说这是谁用我的图书馆shared_memory_pipe.h一些用户的main()

#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

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

比在稍后的时间点进程cann测试pid_parent再次使用getpid()

如果比getpid()的结果不同于pid_parent该进程至少有一个fork()远离父进程。

+0

我不明白, 我不写'main()',我不能那样做。如果我在图书馆那样做,那么在某些情况下,孩子可能永远不会使用图书馆的任何功能,所以我永远无法知道他的pid – hudac

0

哪部分代码负责关闭fd?

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

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

+0

我只是编辑了我的问题,因为我没有写出“ close()'correct,'main()'应该关闭共享内存管道,完全像一个真正的管道,在'pipe(fd)'之后,你应该执行'close(fd [0])''close(fd1 [1])' – hudac

+0

@hudac:好的,如果主要责任关闭fd,而不是图书馆,那么当他们没有正确关闭fd时,你的责任如何?例如,他们可以关闭一个fd而不关闭另一个。 – cdarke

+0

这是正确的,用户可以做他想做的任何事情......问题是:如何跟踪开放的FD?我怎么知道,例如,如果所有进程都关闭了他们的特定fd的写作方?因为如果所有进程关闭了他们的特定fd的写入端,那么,作为一个普通管道,我应该删除管道,不是吗? – hudac