2010-07-01 28 views
0

在Gnu系統上,我可以編寫一個類似dies_ok()的C宏,它將fork一個新進程,運行一段代碼,之後它可以寫入共享它沒有退出的一塊內存,然後在父進程中,我可以確定它是否退出。這對測試很有用:確定一段代碼是否退出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"); 

有什麼辦法可以在沒有fork函數的MSVC上完成這個任務嗎?

編輯:繼承人的那個用gcc Linux上的工作原理實現:http://github.com/zorgnax/libtap/blob/master/tap.h

+0

聽起來像是[halting problem](http://en.wikipedia.org/wiki/Halting_problem)。 – kennytm 2010-07-01 16:12:16

+0

不完全,因爲我不在尋找是否有無限循環。我假設正在測試的代碼將完成而不退出或退出。在Perl中,它將等同於使用eval {exit},然後查看是否定義了$ @。如果它沒有停止,我會有太多的問題。 – Jake 2010-07-01 17:01:42

回答

1

CreateProcess的是像叉

Boost庫已共用爲MSVC存儲器支持()/ EXEC()。您也可以使用Windows原子表是原產於Windows的 查看MSDN瞭解

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

問:我不知道爲什麼在UNIX中,你必須寫一個字符串到共享內存。您可以簡單地從子進程調用exit(n),其中n是索引到預定義的char * p []錯誤代碼或成功代碼列表中。您可以有一個包含255個值的數組,EXIT_SUCCESS不包括0。或者閱讀sysexits.h頭文件以獲得另一組想法。 wait()或waitpid()將返回退出代碼,或確定進程是否未退出

+0

我需要使用共享內存,因爲我不能依賴任何特定的退出值。我想知道它是退出,中止還是崩潰,而不是退出代碼。無論如何,我認爲windows內置的CreateFileMapping()函數將能夠做一些類似於mmap()的東西。 CreateProcess()對我來說似乎不夠強大,因爲它需要一個可執行文件名。我只有幾行代碼。 – Jake 2010-07-01 16:55:01

+0

好吧,所有這些都可以通過WIEXITED,WIFSIGNALED,WCOREDUMP等作爲waitpid()的參數來使用。 – 2010-07-01 19:33:35

+0

子進程將會退出,無論代碼im測試是否完成,或者在代碼完成之後完成。主要的問題是使代碼執行到位,我不能創建一個新的功能,我絕對不能創建一個新的程序。我試圖把它變成這樣一個宏,像dies_ok({int x = 0/0;},「不能被零除」);並希望不必改變這一點。 – Jake 2010-07-01 21:33:04