2010-10-05 85 views
-1

我有兩個應用程序在我的機器上運行。一個應該交出工作,另一個應該工作。我如何確保第一個應用程序/進程處於等待狀態。我可以通過資源驗證其消耗,但這並不能保證。我應該使用哪些工具?如何檢查應用程序是否在等待

+0

尋找令牌環:D – sje397 2010-10-05 23:49:52

+0

對不起。我忘了提及我沒有開發這個應用程序,只測試它。我知道調試是方法,但想知道像procexplorer等工具可以幫助 – user393148 2010-10-06 00:19:27

+0

在這種情況下,我不認爲有一種方式總是有效。我爲我的答案增加了一些可能性,但它們可能不適用於您的情況。 – stribika 2010-10-06 01:04:01

回答

1

你的2個應用程序需要溝通。有很多方法可以做到這一點:

  • 通過套接字發送消息。這樣,如果您使用普通的網絡套接字而不是本地套接字,這兩個進程可以在不同的機器上運行。
  • 如果您使用C語言,則可以使用semget/semop/semctl的信號量。應該有其他語言的接口。
  • 命名管道阻塞,直到進行讀取和寫入操作。您可以使用它進行同步。
  • 信號也適用於此。在C中,它被稱爲sendmsg/recvmsg
  • DBUS也可以使用,並具有variuos語言的綁定。

更新:如果您不能修改處理應用則更難。你必須依靠一些表示進展的跡象。 (我假設你處理應用程序讀取一個文件,做一些處理然後將結果寫入輸出文件。)你知道結果應該是最終大小嗎?如果是這樣,你需要反覆檢查大小(或者每當它發生變化時)。

如果你不知道大小,但你知道處理如何工作,你可以使用它。例如,處理在輸出文件關閉時完成。您可以使用strace查看包括關閉在內的所有系統調用。您可以使用LD_PRELOAD環境變量替換close()函數(在需要replace dlls的窗口中)。通過這種方式,您可以修改處理程序,而無需實際重新編譯,甚至無需訪問其源代碼。

1

你可以使用命名管道 - 第一個應用程序將從它讀取,但它將是空白的,因此它會一直等待(阻止)。第二個應用會在第一個應用繼續時寫入。

1

什麼都不能保證你的應用程序處於等待狀態。你必須通過一些工作並獲得迴應。它可能是交易或不是應用程序 - 應用程序可以確認消息在開始處理之前或處理完成後(成功與否)。如果不等,則通過一項工作就會失敗。試圖寫入TCP/IP套接字還是其他方式,或者是否發生超時。這取決於實施,您正在使用什麼樣的交通工具以及其他要求。

實際上有一種方法可以確定進程(線程)是否處於阻塞狀態並等待套接字(或其他源)上的數據,但這意味着客戶端應該在同一臺計算機上並具有訪問權限需要做到這一點,但除了調試以外,沒有任何意義,您可以使用任何調試器。總體而言,確保應用程序在嘗試通過數據之前等待數據的想法是數據聞不到氣味。更不用說競速條件了 - 如果您檢查並確定了結果,並且實際嘗試發送數據時,您發現應用程序並未等待(即使是微秒)。

相關問題