2010-07-01 2 views
0

В системе Gnu я могу написать макрос C, например dies_ok(), который будет вилять новый процесс, запускать кусок кода, после чего он может писать в общий кусок памяти, который он не выходил, а затем в родительском процессе я могу определить, вышел ли он или нет. Это полезно для испытаний:Определите, если часть кода выходит из программы с помощью 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"); 

Есть ли способ сделать это на MSVC, где нет функции вилки?

EDIT: Heres реализация, которая работает на Linux с GCC: http://github.com/zorgnax/libtap/blob/master/tap.h

+0

Звучит как проблема с остановкой (http://en.wikipedia.org/wiki/Halting_problem). – kennytm

+0

Не совсем так, потому что я не ищу, есть ли бесконечный цикл. Я предполагаю, что тестируемый код либо закончится, либо не закончится, либо не выйдет. В Perl это эквивалентно использованию eval {exit}, а затем, если будет определено $ @. Если бы это не остановилось, у меня было бы слишком много проблем. – Jake

ответ

1

CreateProcess, как вилка()/Exec()

Библиотека BOOST поделилась поддержкой памяти для MSVC. Вы можете также использовать атомную таблицу Windows, который является родным для Windows- см сайта MSDN

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

Q: Я не понимаю, почему в UNIX, вы должны написать строку в общую память. Вы можете просто вызвать exit (n) из дочернего процесса, где n - это индекс в предопределенный char * p [] список кодов ошибок или кодов успеха. Вы можете иметь массив из 255 значений, исключая 0 для EXIT_SUCCESS. Или прочитайте заголовочный файл sysexits.h для другого набора идей. wait() или waitpid() вернет код выхода или определит, не завершился ли процесс

+0

Мне нужно использовать общую память, потому что я не могу полагаться на какое-либо конкретное значение выхода. Я хочу знать, выходит ли он, прерывается или падает, а не код выхода. Во всяком случае, я думаю, что встроенные в Windows функции CreateFileMapping() смогут сделать что-то похожее на mmap(). CreateProcess() не кажется достаточно мощным для меня, поскольку для него требуется имя исполняемого файла. У меня есть только несколько строк кода. – Jake

+0

Ну, все это доступно через WIEXITED, WIFSIGNALED, WCOREDUMP и т. Д. В качестве аргумента waitpid(). –

+0

Детский процесс собирается выйти, независимо от того, прошел ли это тестирование кода im, или я сделал это после завершения этого кода. Основная проблема заключается в том, чтобы сделать код выполненным, я не могу создать новую функцию, и я определенно не могу создать новую программу. Я пытаюсь работать с этим макросом как dies_ok ({int x = 0/0;}, "не может делить на ноль"); и, надеюсь, не придется это менять. – Jake

Смежные вопросы