2017-12-14 24 views
7

pthread_t 값 (pthread_create() 또는 std::thread::native_hanle()에서 반환)을 Linux의 pid (tid)에 매핑하는 정상적인 방법이 있습니까? 누군가가 행복해지기 전에 이 아니며 스레드 자신의 PID를 찾습니다 (gettid()으로 수행 할 수 있음).pthread_t를 pid (Linux)에 매핑하는 방법

미친 방법은 스레드를 강제로 호출하여 gettid()을 호출하고 결과를 전달하는 것이지만 너무 많은 문제가됩니다.

내가 생각할 수있는 응용 프로그램 중 하나는 ps -T이 제공하는 출력으로 프로그램 내에서 생성 된 스레드를 조정하는 것입니다 (pthread_t 사용 가능).

+3

필자가 아는 한, 리눅스에서'pthread_t'는'struct pthread'에 대한 포인터이며,'struct pthread'는'tid' 멤버를 가지고 있습니다. 그러나 나는이 정보를 읽을만한 수용 가능한 방법을 모른다. 사용 가능한 디버그 심볼이 있다면 gdb에서이 구조체를'ptype pthread'로 검사 할 수 있습니다. 디버그 목적으로 만'tid'의 오프셋을'p & ((pthread *) 0) -> tid'로 읽을 수 있고 프로그램 자체에서이 오프셋을 사용하여'pthread_t'에서'tid'를 읽을 수 있습니다. 또는 일부 소형 리더 라이브러리에서 기호 파일 자체의 오프셋을 "휴대용"으로 사용할 수 있습니다. – geza

+0

@geza 정말 재미 있습니다.이 정보를 제공해 주셔서 감사합니다. – SergeyA

+0

스레드의 구현에 따라 다릅니다. linuxthreads는 그들과 관련된 프로세스 id를 가질 수 있으며,'getpid'는 그것을 리턴해야합니다. posix 쓰레드는 그렇지 않을 수 있으므로'getpid'는 주 프로세스의 PID를 반환합니다. 이것을 확인하십시오 : https://stackoverflow.com/a/19677227/1143850 – Serge

답변

3

한 (복잡, 비 휴대용 리눅스 관련, 가볍게 파괴) 다음과 같이 struct pthread로 보지 않고 tid 매핑 pthread_t 방법은 다음과 같습니다

  1. 사용 pthread_setname_np을 스레드 이름을 고유 한 것으로 설정하십시오.
  2. /proc/self/task의 하위 디렉토리를 반복하고 각각의 파일에서 comm이라는 이름의 파일에서 한 행을 읽습니다.
  3. 방금 ​​사용한 고유 문자열과 일치하는 경우 하위 디렉터리 이름의 마지막 구성 요소에서 tid을 추출합니다. 이것이 당신의 대답입니다.

스레드 이름은 OS에서 사용하지 않으므로 변경하는 것이 안전해야합니다. 그럼에도 원래의 값으로 되돌리려는 것입니다 (얻으려면 pthread_getname_np을 사용하십시오).

+0

사실, 내 스레드에는 이미 이름이 있으므로이 접근법을 고려해 볼 가치가 있습니다. 수락. – SergeyA

-1

Pthreads는 POSIX 스레드입니다. pthread_t는 아키텍쳐에 따라 long 타입의 typedef입니다. 실제로 위에서 설명한 것처럼 내부 구조체 pthread에 유형이 지정된 포인터입니다.

구조체 pthread가 반환되지 않습니다. 스레딩은 기본 OS에 크게 의존합니다. 스레드는 모든 유닉스 OS에 똑같이 구현되지 않습니다. gettid가 POSIX 함수라고 생각하지 않습니다. Linux에만 한정된 것 같습니다. https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca

를 참조

당신은 구조체의 pthread 의 리눅스 특정 구현을위한 glibc는/NPTL 소스 코드를 살펴 가질 수 그러나 나는 당신이 GETPID되어 찾고있는 것을 믿습니다. 이 프로세스 ID이며 ID 스레드하지