Как проверить, является ли процесс или поток активным или им не присвоены их идентификаторы в C ?

#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 также хочет запрашивать потоки из других процессов.