2010-07-01 8 views
0

Sur un système Gnu, je peux écrire une macro C comme dies_ok() qui va bifurquer un nouveau processus, exécuter un morceau de code, après quoi il peut écrire dans un partage morceau de mémoire qu'il n'a pas quitté, puis dans le processus parent, je peux déterminer si elle est sortie ou non. Ceci est utile pour les tests:Déterminez si un morceau de code quitte le programme avec MSVC

dies_ok({int x = 0/0;}, "can't divide by zero"); 
lives_ok({int x = 3/7;}, "this is a perfectly fine statement"); 
dies_ok({abort();}, "abort kills the program"); 

Est-il possible d'y arriver sur MSVC où il n'y a pas une fonction de fourchette?

EDIT: Heres l'application qui fonctionne sur Linux avec gcc: http://github.com/zorgnax/libtap/blob/master/tap.h

+0

Cela ressemble au [problème d'arrêt] (http://en.wikipedia.org/wiki/Halting_problem). – kennytm

+0

Pas tout à fait puisque je ne cherche pas s'il y a une boucle infinie. Je suppose que le code testé se terminera sans quitter ou quitter. En Perl, cela équivaudrait à utiliser eval {exit} puis à voir si $ @ est défini. Si ça ne s'arrêtait pas, j'aurais trop de problèmes. – Jake

Répondre

1

CreateProcess est comme fork()/exec()

La bibliothèque BOOST a partagé support de mémoire pour msvc. Vous pouvez également utiliser la table d'atome de Windows qui est originaire de Windows- voir msdn pour

http://msdn.microsoft.com/en-us/library/ms649053(VS.85).aspx

Q: Je ne comprends pas pourquoi unix vous devez écrire une chaîne à mémoire partagée. Vous pouvez simplement appeler exit (n) à partir du processus fils où n est un index dans une liste prédéfinie char * p [] de codes d'erreur ou de codes de réussite. Vous pouvez avoir un tableau de 255 valeurs, à l'exclusion de 0 pour EXIT_SUCCESS. Ou lisez le fichier d'en-tête sysexits.h pour un autre ensemble d'idées. wait() ou waitpid() renverront le code de sortie, ou détermineront si le processus n'a pas quitté

+0

Je dois utiliser la mémoire partagée car je ne peux pas compter sur une valeur de sortie spécifique. Je veux savoir si elle sort, abandonne ou plante, pas son code de sortie. Quoi qu'il en soit, je pense que la fonction intégrée de Windows, CreateFileMapping() sera capable de faire quelque chose de similaire à un mmap(). CreateProcess() ne semble pas assez puissant pour moi car il nécessite un nom d'exécutable. Je n'ai que quelques lignes de code. – Jake

+0

Eh bien, tout cela est disponible via WIEXITED, WIFSIGNALED, WCOREDUMP, etc comme argument de waitpid(). –

+0

Le processus enfant va se terminer, que le code im testing l'ait fait ou que je l'ai fait après la fin du code. Le problème principal est de faire exécuter le code en place, je ne peux pas créer une nouvelle fonction et je ne peux définitivement pas créer un nouveau programme. J'essaie de travailler dans cette macro comme dies_ok ({int x = 0/0;}, "ne peut pas diviser par zéro"); et j'espère ne pas avoir à changer cela. – Jake