/ / Визначення, чи є недоліки сегментації підпроцесу пітона - python, segmentation-fault, subprocess

Визначення недоліків сегментації підпроцесу Python - python, несправність сегментації, підпроцесор

Я пишу програму, яку оцінює студентпрограми, і, як я впевнений, ви можете собі уявити, вони іноді виходять з сегментації. Проблема, яку я маю, полягає в тому, що, коли студент програмує помилки сегментації, немає ознак того, що саме сталося.

    proc = subprocess.Popen(student_command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = proc.communicate()
self.returncode = proc.returncode

Я підбираю stderr, stdout та код поверненняз підпроцесу, але якщо помилка сегментації програми, stderr порожній, stdout порожній, а код повернення - -11. Тепер я міг шукати код виходу -11 і припускати, що якщо це код повернення, сталася помилка сегментації, але також нічого не заважає коду студента мати -11 як код повернення лише тому, що студент відчув як повернення -11.

Як визначити, чи є сегментація підпроцесупомилки, на відміну від просто відчуття, як повернення -11? Мені не дуже цікаво все, що є в stderr і stdout, і для цього я побачив ряд постів, включаючи це що стосується підбору результатів, але я не "тподбайте про все, що стосується результатів, хоча було б непогано вивести рядок "Помилка сегментації" з більш жорсткого, але мені справді потрібен спосіб остаточно розповісти, що сталося з підпроцесом.

Відповіді:

6 за відповідь № 1

Ну, насправді, на UNIX - процес, який намагається повернути -11 зазвичай замість цього повертається додатне ціле число. Це тому, що статус повернення з wait ряд функцій насправді є набором бітових полів, з полем для сигналу, який закінчив процес, та окремим полем для повернутого значення. Python розшифровує wait повернути значення з цих біт-полів.

У більшості систем ці поля не підписані та мають 8 біт розміром, тому ви, мабуть, побачите щось подібне:

>>> import subprocess
>>> subprocess.Popen(["python","-c","import os; os.kill(os.getpid(),11)"]).wait()
-11
>>> subprocess.Popen(["python","-c","exit(-11)"]).wait()
245

У першому випадку процес "segfault" (вбивство себе SIGSEGV) тощо wait повертає -11. В останньому випадку процес закінчується з кодом повернення -11, і отриманий результат wait значення 245 (256-11). Таким чином, ви можете бути впевнені, що будь-яке негативне повернене значення wait повинен представляти смертельний сигнал, на відміну від нормального повернення. Зауважте, що ці процеси можуть вбити себе, щоб підробити фатальну помилку.