check all threads in a process
#include <stdio.h>
#include <sys/syscall.h>
#include <assert.h>
#include <pthread.h>
#include <unistd.h>
void *nbi(void *arg)
{
int i;
printf("child thread lwpid: %u\n", syscall(SYS_gettid));
printf("child thread id: %u\n", pthread_self());
while(1)
{
sleep(2);
printf("come out for fresh air!\n");
}
}
int main()
{
pthread_t tid;
int rc;
printf("main thread lwpid: %u\n", syscall(SYS_gettid));
printf("main thread tid: %u\n", pthread_self());
rc = pthread_create(&tid, NULL, nbi, NULL);
assert(0 == rc);
pthread_join(tid, NULL);
return 0;
}
notice:
1. SYS_gettid is defined in sys/syscall.h;
2. the location of sys/syscall.h in Ubuntu PC is like /usr/include.
3. use the below build cmd to complile gettid.c:
gcc -pthread -o gettid gettid.c
the execution result:
aspirs@ubuntu1204:/work/syscall/gettid$ ./gettid
main thread lwpid: 4960
main thread tid: 3298965248
child thread lwpid: 4961
child thread id: 3290658560
come out for fresh air!
come out for fresh air!
the result of 'ps -T -p 4960' during process 'gettid' running:
aspirs@ubuntu1204:/usr/include$ ps -T -p 4960
PID SPID TTY TIME CMD
4960 4960 pts/3 00:00:00 gettid
4960 4961 pts/3 00:00:00 gettid
according to gettid's log, we can know 4960 and 4961 on SPID column are the TIDs of main thread of gettid and the another thread in gettid.
the result of 'top -H -p 4960' during process gettid running: