Как я могу убить разветвленный процесс в C ++? - PullRequest
0 голосов
/ 01 марта 2012

Я работаю над игрой, поэтому однажды мне пришлось использовать fork(), основной поток запускает графику opengl, а дочерний поток запускает игровую логику.

Теперь у меня проблема. В какой-то момент пользователь может нажать кнопку «Выход» внутри игры, которая обрабатывается вторичным потоком. Кроме того, в какой-то момент пользователь может нажать кнопку X, чтобы выйти из игры, которая обрабатывается основным (перенасыщенным) потоком. Итак, вот мой вопрос: как я могу убить другой работающий поток и выйти?

Прямо сейчас, если я закрою окно, второй поток продолжит работу, а если второй поток завершит работу, первый продолжит работу.

Обработать кнопку «X» можно с помощью функции atexit, но я не нашел (безопасного) способа убийства glutMainLoop().

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Если вы на самом деле вызываете fork() (вместо запуска нового потока), то вы фактически создаете другой работающий процесс.Когда вызывается fork(), он возвращает идентификатор процесса родительскому процессу.Это может быть передано kill(), чтобы убить процесс.В Linux это выглядит так:

#include <signal.h>

pid_t pid = fork();
if (pid == 0) {
   // you are in the child process
} else if (pid > 0) {
   // you are in the parent process
   ...
   // send a termination signal
   kill(pid, SIGTERM);
} else {
   // fork had an error which should be logged...
}

Вам нужно выбрать, какой сигнал отправить процессу.SIGKILL (9) убивает его, например.

0 голосов
/ 01 марта 2012

Пожалуйста, будьте точны в отношении thread и process, поскольку они описывают различные предметы.

Поскольку вы используете fork(), вы на самом деле имеете дело с процессами. Вместо этого я рекомендую использовать threads, так как он намного эффективнее использует память (поскольку программа должна быть в памяти только один раз) и проще в управлении. Конечно, вы должны иметь дело с критическими секциями самостоятельно.

Здесь является хорошим примером для работы с потоками.

Если вы настаиваете на использовании процессов и fork(), вы все равно можете отправлять сигналы и реализовывать определенные обработчики сигналов. Я также читал некоторые статьи об IPC (межпроцессное взаимодействие), например http://tldp.org/LDP/lpg/node7.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...