#c #multithreading #process #cross-platform
#c #многопоточность #процесс #кроссплатформенность
Вопрос:
Учитывая идентификатор процесса или потока, как написать функцию C , чтобы проверить, является ли он активным или нет. Я хотел бы реализовать это как в Windows, так и в Linux.
Комментарии:
1. Вам нужно предоставить точное определение того, что такое «живой» (убитый? приостановлено? никогда не существовало? )
2. @JosephH Я имею в виду, что процесс завершен.
3. Обратите внимание, что делать это немного рискованно … всегда существует небольшая вероятность того, что идентификатор процесса # x завершился, а затем идентификатор процесса был повторно использован ОС и передан другому процессу. По этой причине операционные системы обычно стараются как можно дольше избегать использования номеров идентификаторов процессов, но в конечном итоге цифры переносятся, и вы рискуете подумать, что «ваш процесс» запущен, когда на самом деле это какой-то другой, не связанный процесс.
Ответ №1:
Если вы не хотите добавлять в свой проект дополнительную зависимость от библиотеки, вы могли бы обернуть системный код с помощью директив препроцессора (например: #ifdef _WIN32
).
Windows
Функции GetExitCode * возвращаются STILL_ACTIVE
, если они завершаются успешно и процесс или поток все еще существует.
Linux
- уничтожить — отправить нулевой сигнал (0), чтобы проверить, действителен ли по-прежнему pid.
Ответ №2:
Сначала вам нужно решить, проверяете ли вы процесс или поток. Эти два имеют очень разную семантику. Для процессов попробуйте неофициальный Boost.Процесс. Для потоков, Boost.Ветки.
Ответ №3:
Сообщить, является ли идентификатор процесса или потока активным, — это два разных вопроса.
Идентификаторы потоков проще — они являются частью процесса — и поэтому процесс должен знать, что он их создал, и может проверить, являются ли они текущими.
Идентификаторы процессов — это другой вопрос — новый процесс может быть создан после того, как предыдущий onw скончался с тем же идентификатором.
Хорошим решением для этого является наличие семейства взаимодействующих процессов. Вы можете присвоить им имена и использовать вместо них имя или разделяемую память. Я рекомендую последнее.
Комментарии:
1. Я думаю, что OP также хочет запрашивать потоки из других процессов.