2014-01-13 3 views
2

Как смоделировать системный сбой или сбой питания в C#/C++?C#, имитирующий системный сбой

Я пишу библиотеку, которая похожа на базу данных и должна реализовать некоторые аспекты принципа транзакции типичных баз данных sql. В библиотеке есть один метод, в котором он должен убедиться, что все данные записаны на жесткий диск (используя функцию win api FlushFileBuffers). После этой строки библиотека рассмотрит транзакцию как завершенную. После некоторых исследований я узнал, что FlushFileBuffers не является надежным, например. жесткий диск мог просто вернуть, что все буферы очищены, даже если это не так. Мне нужен способ немедленно убить мою систему после вызова FlushFileBuffers, чтобы проверить, действительно ли данные были записаны после строки кода. Это может выглядеть так:

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

При следующем перезапуске системы я мог проверить, действительно ли данные были выписаны. Если нет способа убить систему, есть ли другой сценарий, который я мог бы использовать для проверки этого? Все идеи приветствуются!

+2

Выполнить это внутри виртуальной машины и аварии (или «убить -9») хост-процесс VM. – user2864740

+0

(я не знаю, как можно было бы синхронизировать этот процесс.) – user2864740

+0

Одна вещь, которую вы можете сделать, это иметь программу, которая перечисляет процессы и убивает каждый, кроме себя. Это должно быть сделано в цикле, и внутреннее убийство должно быть проверено. Запустите такую ​​программу на привилегиях администратора, и ваша ОС закроется со скоростью света: D – SOReader

ответ

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

+2

Если я использую это непосредственно в своем приложении, он все равно будет очищать все буферы, например, даже без FlushFileBuffers все файлы будут правильно записаны (но они будут повреждены, если я отключу мой компьютер). Но вы имеете в виду, что я должен запустить свое приложение в виртуальной машине, а затем убить виртуальную машину? Это может сработать. Мне потребуется некоторое время, чтобы проверить ... :) – luz

0

Решение параллелей, чтобы не имитировать ее в первую очередь. У них есть инструмент для записи чисел на жесткий диск и отправки их на сервер одновременно. Вы активно вытаскиваете вилку компьютера и перезагружаете его. Инструмент после перезагрузки проверяет, меньше ли число на жестком диске, чем номер на номере. Если это так, то промывка жесткого диска не работает.

Не очень, но должен работать ...

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