LINUX.ORG.RU

[C] pthread_create и PID

 


0

0

Всем привет!

Вопрос по PID для процесса, созданного через pthread_create.

Ситуация такая:
- есть 2 девайса на основе процессора PPC440GRx
- на каждом девайсе крутится немного разная сборка Linux'a 2.6.21-rc4. (точных различий в сборках к сожалению не знаю)

И вот заметил я недавно странную вещь:
при запуске проги на одном из девайсов каждый процесс, созданный посредством pthread_create получает собственный PID,
а на другом девайсе при запуске той же проги процессы имеют один единственный PID на всех.

Значение PID вытаскиваю с помощью getpid().

Собсно вопрос: каким образом регулируется назначение PID'ов процессам? Что сделать, чтобы на обеих сборках linux'а каждому процессу назначался уникальный PID?



Последнее исправление: Bokrenok (всего исправлений: 1)

каждый процесс, созданный посредством pthread_create

Ты разницу между процессом и потоком осознаёшь?

процессы имеют один единственный PID на всех

Это невозможно, ты что-то понял не так.

anonymous
()
Ответ на: комментарий от anonymous

вот лог запуска:

первый девайс:

17:20:20.538 [INFO] CfgM: main task. pid: 205
17:20:20.539 [INFO] consol task: start. pid 207
17:20:20.540 [INFO] consol task_wr: start. pid 208
17:20:20.540 [INFO] conn task: start. pid 209
17:20:20.540 [INFO] timer task: start. pid 210


второй девайс:

16:55:42.246 [INFO] CfgM: main task. pid: 225
16:55:42.246 [INFO] consol task_wr: start. pid 225
16:55:42.247 [INFO] consol task: start. pid 225
16:55:42.248 [INFO] conn task: start. pid 225
16:55:42.248 [INFO] timer task: start. pid 225


прога одна и та же.

Bokrenok
() автор топика

Ты напутал с определениями процесс/поток, но вопрос понятен. У потоков вызов getpid() возвращал разный pid в реализации linuxthreads. На реализации nptl, pid для всех потоков возвращается один и тот же. (если углубляться в детали, то это даже не pid, а tgid -> thread group id)

Запусти libc.so, чтобы увидеть свою реализацию потоков.

Chumka ★★★
()

насчет «процесса» я погорячился. поток конечно имеется ввиду

Bokrenok
() автор топика
Ответ на: комментарий от Chumka

ага. вон оно где кроется. спасиб!

первый девайс (разные PID)
-------------------------------------------------------------------
GNU C Library stable release version 2.3.5, by Roland McGrath et al.
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.0.0 (DENX ELDK 4.0 4.0.0).
Compiled on a Linux 2.6.15 system on 2006-01-11.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
linuxthreads-0.10 by Xavier Leroy
BIND-8.2.3-T5B
libthread_db work sponsored by Alpha Processor Inc
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
software FPU emulation by Richard Henderson, Jakub Jelinek and others
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
-------------------------------------------------------------------


второй девайс (одинаковые PID)

-------------------------------------------------------------------
GNU C Library stable release version 2.7, by Roland McGrath et al.
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.3.2.
Compiled on a Linux >>2.6.18-6-powerpc-smp<< system on 2009-01-04.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
-------------------------------------------------------------------

Bokrenok
() автор топика
Ответ на: комментарий от Chumka

а какая есть замена getpid() в случае NPTL, для получения уникального ID потока?

про gettid() компилер не знает =(

Bokrenok
() автор топика
Ответ на: комментарий от kemm

Да, не забудь внимательно NOTES в мане прочитать, а то, если судить по gettid(), ты это забываешь делать:

man gettid

CONFORMING TO

gettid() is Linux-specific and should not be used in programs that are intended to be portable.

NOTES

Glibc does not provide a wrapper for this system call; call it using syscall(2).

kemm
()
Ответ на: комментарий от kemm

с gettid разобрался.

можно как-то запинать ps и top, чтобы показывали все потоки программы? особенно интересен top, дабы глядеть загрузку процессора по потокам.

Bokrenok
() автор топика
Ответ на: комментарий от Bokrenok

Не хочу показаться невежливым, но man top/man ps, /thread

8))

kemm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.