如何检查应用程序是否在等待中

时间:2010-10-05 23:45:35

标签: concurrency

我的计算机上运行了两个应用程序。一个人应该参与工作,另一个人应该做这项工作。如何确保第一个应用程序/进程处于等待状态。我可以通过资源验证其消耗,但这并不能保证。我应该使用哪些工具?

3 个答案:

答案 0 :(得分:1)

你可以使用命名管道 - 第一个应用程序将从中读取但它将是空白的,因此它将一直等待(阻止)。当第二个应用程序希望第一个应用程序继续时,它将写入其中。

答案 1 :(得分:1)

你的2个应用程序应该通信。有很多方法可以做到这一点:

  • 通过套接字发送消息。这样,如果使用普通的网络套接字而不是本地网络套接字,则2个进程可以在不同的机器上运行。
  • 如果您使用的是C语言,则可以使用信号量semget / semop / semctl。应该有其他语言的接口。
  • 命名管道阻塞,直到正在进行读取和写入操作。您可以使用它进行同步。
  • 信号对此也有好处。在C中,它被称为sendmsg / recvmsg
  • 也可以使用
  • DBUS并对variuos语言进行绑定。

更新:如果您无法修改处理应用程序,那就更难了。你必须依靠一些表明进展的迹象。 (我假设您正在处理应用程序读取文件,进行一些处理然后将结果写入输出文件。)您知道结果的最终大小吗?如果是这样,你需要反复检查尺寸(或者每当它改变时)。

如果您不知道尺寸但是您知道处理的工作原理,那么您可以使用它。例如,处理在输出文件关闭时完成。您可以使用strace查看所有系统调用,包括关闭。您可以使用LD_PRELOAD环境变量替换close()函数(在必须replace dlls的窗口上)。这样,您可以修改处理程序,而无需实际重新编译或甚至可以访问其源。

答案 2 :(得分:1)

没有什么能保证您的应用程序处于等待状态。你必须通过一些工作并得到回复。它可能是交易与否 - 应用程序可以确认它在开始处理之前或处理之后(成功与否)获得要处理的消息。如果它不等待,通过一项工作应该失败。是否尝试写入TCP / IP套接字或其他方式,或者是否发生超时。这取决于实施,您正在使用什么类型的传输和其他要求。

实际上有一种方法可以确定进程(线程)是否处于阻塞状态并等待套接字(或其他源)上的数据,但这意味着客户端应该位于同一台计算机上并具有所需的访问权限要做到这一点,但除了调试之外没有任何意义,无论如何你都可以使用任何调试器。

总的来说,确保应用程序在尝试传递数据之前等待数据的想法很糟糕。更不用说比赛条件了 - 如果你检查并且没问题,当你真正尝试发送数据时,你发现应用程序当时没有等待(即使这是微秒)。