C#模拟系统崩溃

时间:2014-01-13 23:29:00

标签: c# c++ database testing

如何在c#/ c ++中模拟系统崩溃或断电?

我正在编写一个类似于数据库的库,需要实现典型sql数据库的事务原理的某些方面。该库有一种方法,它必须确保所有数据都写入硬盘驱动器(使用win api函数FlushFileBuffers)。在此行之后,库将认为交易已完成。经过一些研究后,我发现FlushFileBuffers不可靠,例如硬盘驱动器可以返回所有缓冲区都被冲洗,即使这样也不是这样。我需要一种方法来在FlushFileBuffers调用之后立即杀死我的系统,以检查数据是否在代码行之后实际写出。这看起来像这样:

writeToFile(fileHandle);
FlushFileBuffers(fileHandle);
killSystem(); //this is missing

在下次重启系统时,我可以检查数据是否实际写出来。如果没有办法杀死系统,还有其他方案可以用来测试吗?欢迎所有想法!

2 个答案:

答案 0 :(得分:2)

调用TerminateProcess不应允许任何进程进行清理。

static void Main(string[] args)
{
    // Get the process.
    Process target = Process.GetProcesses()
        .First(p => 
               p.ProcessName.IndexOf("VMWare",
                                     StringComparison.OrdinalIgnoreCase) >= 0);

    // Headshot!
    TerminateProcess(target.Handle, 0);
}

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool TerminateProcess(IntPtr hProcess, int uExitCode);

使用user2864740建议的虚拟机并使用上述方法将其杀死可能会产生预期的效果。

详细了解TerminateProcess

答案 1 :(得分:0)

平行线的解决方案是首先不模拟它。他们有一个工具可以将数字写入硬盘驱动器并同时将其发送到服务器。您主动拔出电脑的插头并重新启动它。重新启动后,该工具将检查硬盘驱动器上的号码是否小于号码上的号码。如果是这种情况,冲到硬盘驱动器不起作用。

不漂亮,但应该有效......