2010-10-05 5 views
-1

J'ai deux applications en cours d'exécution sur ma machine. L'un est censé remettre le travail et l'autre est censé faire le travail. Comment puis-je m'assurer que la première application/le processus est en attente. Je peux vérifier via les ressources sa consommation, mais cela ne le garantit pas. Quels outils devrais-je utiliser?Comment vérifier si une application est en attente

+0

Recherchez la bague à jeton: D – sje397

+0

Je suis désolé. J'ai oublié de mentionner que je ne développais pas cette application, je la testais seulement. Je sais que le débogage est moyen, mais je me demandais si des outils comme procexplorer etc peuvent aider – user393148

+0

Dans ce cas, je ne pense pas qu'il existe un moyen qui fonctionne toujours. J'ai ajouté quelques possibilités à ma réponse mais elles peuvent ne pas être applicables dans votre cas. – stribika

Répondre

1

Vos 2 applications doivent communiquer. Il y a plusieurs façons de le faire:

  • Envoie des messages via des sockets. De cette façon, les deux processus peuvent s'exécuter sur des machines différentes si vous utilisez des sockets réseau normaux au lieu des sockets locaux. Si vous utilisez C, vous pouvez utiliser des sémaphores avec semget/semop/semctl. Il devrait y avoir des interfaces pour cela dans d'autres langues.
  • Les canaux nommés se bloquent jusqu'à ce qu'une opération de lecture et une opération d'écriture soient en cours. Vous pouvez l'utiliser pour la synchronisation.
  • Les signaux sont également bons pour cela. En C, il est appelé sendmsg/recvmsg.
  • DBUS peut également être utilisé et a des liaisons pour les langues variuos.

Mise à jour: Si vous ne pouvez pas modifier l'application de traitement, il est plus difficile. Vous devez compter sur certains signes qui indiquent les progrès. (Je suppose que votre application de traitement lit un fichier, puis un traitement écrit le résultat dans un fichier de sortie.) Savez-vous quelle devrait être la taille finale du résultat? Si c'est le cas, vous devez vérifier la taille à plusieurs reprises (ou chaque fois que cela change).

Si vous ne connaissez pas la taille, mais vous savez comment le traitement fonctionne, vous pouvez l'utiliser. Par exemple, le traitement est effectué lorsque le fichier de sortie est fermé. Vous pouvez utiliser strace pour voir tous les appels système, y compris la fermeture. Vous pouvez remplacer la fonction close() par la variable d'environnement LD_PRELOAD (sous Windows, replace dlls). De cette façon, vous pouvez modifier le programme de traitement sans vraiment le recompiler ou même avoir accès à sa source.

1

Vous pouvez utiliser des tubes nommés - la première application lira à partir de celle-ci mais elle sera vide et par conséquent elle continuera à attendre (bloquée). La deuxième application va écrire dedans quand elle veut que le premier continue.

1

Rien ne garantit que votre application est en attente. Vous devez passer un peu de travail et obtenir une réponse. Il peut s'agir de transactions ou non - l'application peut confirmer qu'elle a traité le message avant qu'il ne commence à le traiter ou après qu'il ait été traité (avec succès ou non). Si ça n'attend pas, passer un morceau de travail devrait échouer. Que ce soit lorsque vous essayez d'écrire sur un socket TCP/IP ou d'autres moyens, ou si le délai d'attente se produit. Cela dépend de la mise en œuvre, du type de transport que vous utilisez et d'autres exigences. Il existe en fait un moyen de déterminer si le processus (thread) est en état de blocage et en attente de données sur un socket (ou une autre source), mais cela signifie que le client doit être sur le même ordinateur et avoir des privilèges d'accès requis pour le faire, mais cela n'a pas de sens autre que le débogage, ce que vous pouvez faire en utilisant n'importe quel débogueur de toute façon. Dans l'ensemble, l'idée de s'assurer que l'application attend des données avant de tenter de les transmettre est que les données sont mauvaises. Sans parler de la condition de course - que se passerait-il si vous aviez vérifié et que c'était OK, et quand vous avez essayé d'envoyer les données, vous avez découvert que l'application n'attend pas à ce moment-là (même si c'est en microsecondes).

Questions connexes