Идентификатор процесса Linux и идентификатор потока - PullRequest
2 голосов
/ 19 декабря 2011

Предположим, у нас много пользовательских процессов, работающих в Linux.Каждый процесс имеет много работающих потоков.

Я могу получить идентификатор процесса, вызвав getpid(), возвращаемое значение которого является целым числом.

Я могу получить идентификатор потока, вызвав pthread_self(), возвращаемым значением которого является непрозрачный тип с именем pthread_t.

Теперь мне нужно сохранить идентификатор процесса (целое число, как правило, 4 байта) и идентификатор потока (pthread_t, нужно выяснить, сколько байтов) в общей памяти, чтобы позже я мог использовать двафрагменты идентификационной информации, чтобы идентифицировать этот конкретный поток и проверить, работает ли этот поток по-прежнему.

Я обнаружил, что многие онлайн-источники приводят pthread_t к unsigned int или unsigned long.Поскольку я не хочу потери данных во время приведения, как мне поступить с данными pthread_t, чтобы они представляли собой фрагмент данных фиксированного размера (как уже упоминалось, мне нужно хранить информацию о потоках в общей памяти).

Кроме того, как мне определить этот конкретный поток по комбинации идентификатора процесса и идентификатора потока позже?Как проверить, работает ли поток или нет?

Ответы [ 4 ]

4 голосов
/ 19 декабря 2011

Если вы хотите хранить pid_t и pthread_t в любом месте, вы должны использовать их соответствующие типы (то есть "pid_t" и "pthread_t"). Поэтому, если вы хотите где-то хранить их в общей памяти, выполните memcpy(), чтобы получить их там.

Что касается идентификации конкретных потоков по комбинациям PID и TID, см. Комментарий Немо.

Если вы предполагаете, что они будут существовать, ваша программа может посмотреть на /proc, чтобы найти соответствующий каталог pid, и найти в /proc/<pid>/task потоки.

3 голосов
/ 19 декабря 2011

Вы можете использовать pthread_join как грубый способ определения завершения, но я уверен, что это не то, что вы хотите. Вместо этого вы должны обработать это самостоятельно, создав флаг завершения потока. Хороший способ установить этот флаг в обработчиках очистки pthread. Посмотрите этот связанный пост

2 голосов
/ 19 декабря 2011

Почему бы вам просто не упаковать их в struct?

typedef struct
{
    int procID;
    pthread_t threadID;

} ProcThreadID;

, не беспокоясь о конкретном базовом типе pthread_t (ведь мы находимся в C, так что все это POD иможно скопировать вслепую с помощью memcpy).

Вы можете легко получить его размер с помощью оператора sizeof:

size_t ptIDSize = sizeof(ProcThreadID);

и скопировать его в любое удобное место с помощью простого memcpy.

0 голосов
/ 10 мая 2013

команда для получения идентификатора потока, запущенного в процессе
$ ps -eLf |grep 14965

UID PID PPID LWP C NLWP STIME TTY TIME CMD <br> root 14965 14732 14965 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14966 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14967 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14968 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14969 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14970 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14971 0 201 15:28 pts/10 00:00:00 ./a.out <br> root 14965 14732 14972 0 201 15:28 pts/10 00:00:00 ./a.out

Здесь 4-й столбец (LWP) показывает все потоки, работающие в процессе с идентификатором 14965

...