Почему процесс.communicate приводит к остановке моей программы?C++

Программы на C++. Форум разработчиков
Anonymous
Почему процесс.communicate приводит к остановке моей программы?

Сообщение Anonymous »

Я выполняю некоторый код программы на Python, и когда я запускаю C++, мне нужно обрабатывать стандартный ввод для него, например scanf и cin. Я запускаю скомпилированную программу на C++, используя subprocess.Popen. Я ожидаю, что истечет время ожидания и возникнет исключение, когда я не передаю стандартный ввод, но моя программа сразу же завершает работу и печатает на консоли Killed.
Вот часть моего класса, которой, я считаю, достаточно

Код: Выделить всё

    def run(
self, args: List[str] = [], stdin: str = "", timeout: int = 30
) -> Tuple[int, str, str]:

process = subprocess.Popen(
[os.path.join(self.temp_file_folder, "build", self.target_file_name)]
+ args,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)

try:
stdout, stderr = process.communicate(input=stdin, timeout=timeout)
except subprocess.TimeoutExpired as e:
process.kill()
raise RunTimeoutError(f"Expired in {timeout}s")

return (process.returncode, stdout, stderr)
Когда я использую 30 секунд, программа завершает работу сразу после запуска процесса.communicate и печатает Killed на консоли без каких-либо исключений. Но когда я использую 5s, как я и ожидал, выдается исключение.
Я вызываю свою функцию без какого-либо стандартного ввода.
когда таймаут == 30 выводит следующее: когда таймаут == 5 выводит следующее:

Код: Выделить всё

Traceback (most recent call last):
File "/home/jayzhu/projects/code-auto-comment/src/runner/__init__.py", line 161, in 
res = runner.run(timeout=5)
File "/home/jayzhu/projects/code-auto-comment/src/runner/__init__.py", line 124, in run
raise RunTimeoutError(f"Expired in {timeout}s")
__main__.RunTimeoutError: Expired in 5s
Это код C++, который я выполнял в то время

Код: Выделить всё

#include 
#include 
#include 
#include 

int main()
{
int N;
double sum = 0;
double product = 1;

std::cout > N;

while (std::cin.fail() || N < 1 || N > 50)
{
std::cin.clear();
std::cin.ignore(std::numeric_limits::max(), '\\n');
std::cout > N;
}

std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78796128/why-does-process-communicate-cause-my-program-to-be-killed[/url]

Вернуться в «C++»