Как получить SPID в Linux 2.6 с С++

У меня вопрос: есть ли способ получить SPID в Linux 2.6 из приложения C++? Когда я делаю «ps -amT», я вижу потоки в процессе:

[email protected]:~# ps -amT
  PID  SPID TTY          TIME CMD
 1120     - pts/1    00:00:20 sncmdd
    -  1120 -        00:00:00 -
    -  1125 -        00:00:00 -
    -  1126 -        00:00:00 -
    -  1128 -        00:00:00 -
    -  1129 -        00:00:09 -
    -  1130 -        00:00:00 -
    -  1131 -        00:00:09 -
 1122     - pts/1    00:00:00 snstatusdemuxd
    -  1122 -        00:00:00 -
    -  1127 -        00:00:00 -
    -  1132 -        00:00:00 -
    -  1133 -        00:00:00 -

И тогда в файловой системе я вижу потоки:

[email protected]:~# ls /proc/1120/task/
1120  1125  1126  1128  1129  1130  1131

Итак, есть ли способ получить SPID из моего приложения, чтобы я мог каким-то образом определить, какой у меня SPID в каждом запущенном потоке?

Спасибо!

/Майк

Изменить: я должен добавить, что PID, возвращаемый из getpid(), одинаков в каждом потоке.

Когда я добавляю этот код в свои потоки:

// Log thread information to syslog
syslog(LOG_NOTICE, "ibnhwsuperv: gettid()= %ld,  pthread_self()=%ld", (long int)syscall(224), pthread_self());

Я получаю этот результат:

Jan  1 01:24:13 10 ibnhwsupervd[1303]: ibnhwsuperv: gettid()= -1,  pthread_self()=839027488

Ни один из них не похож на SPID, заданный ps или в файловой системе proc.

Также обратите внимание, что gettid не возвращает SPID.


person mikelong    schedule 31.03.2009    source источник
comment
Где ссылка говорит, что gettid не возвращает SPID? Судя по тому, что вы получили ошибку (она вернула -1), я думаю, вы просто ошиблись номером системного вызова. 224 работает только на некоторых архитектурах.   -  person jpalecek    schedule 31.03.2009
comment
Возврат -1, вероятно, означает, что системный вызов имеет ошибку. Смотри еррно. Ты уверен, что правильно называешь? Использование syscall() звучит неправильно. В любом случае используйте имя (SYS_gettid), а не номер. syscall(SYS_gettid) у меня работает.   -  person MarkR    schedule 01.04.2009


Ответы (1)


Как насчет gettid()?

Изменить: если в вашей libc нет функции gettid(), вы должны запустить ее следующим образом:

#include <sys/syscall.h>
syscall(SYS_gettid);

... или см. пример на этой странице руководства.

person jpalecek    schedule 31.03.2009
comment
Спасибо за ответ. ср. последнее редактирование, вызов gettid не возвращает SPID. - person mikelong; 31.03.2009