进程和线程相关的问题

时间:2011-04-27 12:43:14

标签: c++ c

我正在开发一个基于一个库的应用程序 我面临的问题与父流程和父流程中的分叉流程之间的沟通有关 我需要访问库中的Function,并且库的指针在Parent进程中,我使用Parent Process中的指针从Forked进程调用库的functins。父进程中的函数从Forked进程调用,但库中的currusponding函数保持bloked状态,因为它应该从Parent Process调用,而不是从Forked进程调用。

这个问题的解决方案应该是什么。

***更新:
我提到的图书馆不是大量加载的库,它有一个类,我通过我的父进程实例化了该类,然后库将创建自己的thred并继续在其中运行,
因此,当我通过父进程调用库时,它会通过,当我使用父指针通过分叉进程调用库函数时,它无法完成。它不是segements但它在函数调用中变得臃肿。

4 个答案:

答案 0 :(得分:2)

在fork之后,你的两个进程都加载了库,并且任何现有的指针在它们中都有效,但是在函数调用或数据访问方面它们之间没有进一步的连接。如果父级调用一个函数,则父级将运行该函数。如果孩子调用一个函数,孩子将运行该函数。没有一个进程在另一个进程中调用函数的概念。

如果您希望两个进程进行通信,则需要编写代码才能使它们这样做。阅读interprocess communication,了解各种方法。一个简单的选择是在分叉之前调用pipe(),在fork之后,让父关闭一个文件描述符,子关闭另一个。现在,您可以让一个进程向另一个进程发送消息。做两次,你有双向沟通。您可以让父运行一个循环,通过一个管道等待来自子进程的消息,对它们起作用,并通过另一个管道发回结果。

答案 1 :(得分:1)

您没有说明您使用的操作系统,但通常指针在各个进程中无效。大多数操作系统为每个进程提供自己的虚拟内存空间,因此地址0x12345678可能是指向某个进程中某些内容的指针,但在另一个进程中甚至不是可用的有效地址。

如果分叉进程想要调用一个函数,它必须自己访问它(链接或打开库本身等)。

答案 2 :(得分:1)

如果您尝试跨两个进程共享内存,但是相同的可执行文件,那么您应该使用线程而不是分支单独的进程。正如其他人所提到的,分叉为你提供了一个单独的内存空间,因此你无法传递指针。使用线程,您将共享相同的内存空间。

答案 3 :(得分:1)

您已达到Inter Process Communication(IPC)问题,其中一个程序想让另一个程序做某事。

由于您fork()编辑了进程,它现在独立存在,并且能够在进程上执行一个函数''我必须找到一种方式让他们沟通:

孩子:爸爸,请用这些参数执行这个函数,请给我这个指针的结果。

这个问题非常广为人知,你有很多解决方案,其中之一就是设计自己的IPC语言并在其上实现Remote Procedure Call(RPC)。

现在,人们已经解决了这个问题,所以你可以看看其中的一些事情:

IPC方法

  • 套接字(unix和网络)
  • 消息队列
  • 共享内存

RPC协议

  • D-Bus
  • Corba
  • TPL(不是RPC协议,但您可以使用它构建一个)