TerminateProcess по сравнению с Ctrl+C

это справедливо и часть кода, работ надежды для Вас

            $ch = @curl_init();
            @curl_setopt($ch, CURLOPT_URL, 'http://example.com');
            @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
            @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            @curl_setopt($ch, CURLOPT_TIMEOUT, 10);

            $response       = @curl_exec($ch);
            $errno          = @curl_errno($ch);
            $error          = @curl_error($ch);

                    $response = $response;
                    $info = @curl_getinfo($ch);
return $info['http_code'];
6
задан udondan 18 March 2015 в 05:24
поделиться

4 ответа

Все это веские аргументы, но единственный способ узнать наверняка - это попробовать. Поэтому я написал простую программу, которая выделяет буфер размером 1 ГБ, назначает ему некоторые данные, а затем записывает их в файл с помощью единственной функции fwrite (). Я пробовал несколько методов, чтобы запись «повредила» данные (я ожидал, в частности, усеченного файла):

  • Вызов TerminateProcess (через perl-функцию kill и Win32 :: Process :: Kill)
  • Удар Ctrl C
  • Использование «Завершить процесс» диспетчера задач
  • Использование «Завершить процесс» в Process Explorer

Ничто не остановит запись - в любом случае файл был правильного размера и имел правильные данные . И хотя «Убить» происходило мгновенно, процесс задерживался до завершения записи.

5
ответ дан 17 December 2019 в 02:32
поделиться

Your application has to the opportunity to handle CtrlC and CtrlBreak, as key strokes or signals (depends on config), meaning that the application has the opportunity to make a clean exit, these would be a much softer way to terminate a process, allowing it a little more execution time if nothing else.

TerminateProcess is more of a kick in the teeth, the application cannot handle this, it comes from the kernel, and if the application could handle it, this would create all sorts of issues with 'un killable' processes hanging their TerminateProcess handler and refusing to exit.

As I understand it as soon as TerminateProcess is called on the process, it can not execute anymore code thats it, no clean up, no shutdown, its just over, you cant handle it, it simply wouldn't make sense if you could, not from a security perspective.

Excellent code project article here on handling windows console signals:

http://www.codeproject.com/KB/winsdk/console_event_handling.aspx

Implementing some of the above signal handling you could ensure that the database writes have a chance to complete before the program exits, rather than possibly leaving it to chance.

You can block TerminateProcess, but its' not really 'polite' programming, it's more like root kit programming, I have seen a good article on this at rootkit.com so search there for 'Process Invincibility' once you have the invincible process, it could in its own time shut down after receiving such a 'request', and perform any clean up before hnad, but this most certainly a hack.

It seems to me though that the CtrlC behaviour you are currently seeing is due it not immediately ending the running process.

1
ответ дан 17 December 2019 в 02:32
поделиться

SQLite утверждает, что является атомарным, даже во время сбоев питания, см. http://www.sqlite.org/atomiccommit.html .

Единственным исключением из этого правила является то, что некоторые дисковые системы сообщают об успешной записи до того, как данные будут фактически записаны на диски, т.е. данные находятся в кэше диска или операционная система лжет SQLite. См. http://www.sqlite.org/lockingv3.html , раздел 6.0 Как повредить файлы базы данных.

Завершенные процессы должны остановить все запущенные потоки и завершить ожидающие операции ввода-вывода перед выходом . Целостность данных должна быть обеспечена при условии, что в процессе не произошел сбой.

0
ответ дан 17 December 2019 в 02:32
поделиться

Я считаю, что для ваших целей безопаснее использовать Ctrl C . Это вызовет отправку сигнала программе о завершении. Если программа не обрабатывает сигнал, она немедленно завершается.

TerminateProcess принудительно завершает процесс и все дочерние потоки.

From MSDN :

TerminateProcess Function Terminates указанный процесс и все его потоки. ... Замечания

Используется функция TerminateProcess безоговорочно вызвать процесс Выход. Состояние глобальных данных поддерживается библиотеками динамической компоновки (DLL) могут быть скомпрометированы, если TerminateProcess используется, а не ExitProcess.

TerminateProcess инициирует завершение и немедленно возвращается. Это останавливает выполнение всех потоков внутри обрабатывает и запрашивает отмену все ожидающие ввода-вывода. Прекращено процесс не может выйти, пока все ожидающие Ввод-вывод был завершен или отменен.

Процесс не может предотвратить

У процесса есть способы заблокировать TerminateProcess, но я сомневаюсь, что SQLite3 сможет это сделать.

0
ответ дан 17 December 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: