2017-12-14 158 views
7

क्या pthread_t मान (pthread_create() या std::thread::native_hanle() से लौटा हुआ है) को लिनक्स में पिड (टिड) में मैप करने का कोई तरीका है? किसी को डुप्लिकेट-खुश होने से पहले, यह थ्रेड के स्वयं के पिड को खोजने के बारे में नहीं है (जिसे gettid() के साथ किया जा सकता है)।pthread_t से pid (लिनक्स पर) को मानचित्र करने के लिए कैसे करें

पागल तरीका किसी भी तरह से थ्रेड को gettid() पर कॉल करने के लिए मजबूर करेगा और परिणाम के साथ पास होगा, लेकिन यह बहुत अधिक परेशानी है।

मेरे मन में संभावित अनुप्रयोगों में से एक है प्रोग्राम के भीतर बनाए गए धागे को जोड़ना (जहां pthread_t उपलब्ध है) ps -T द्वारा प्रदान किए गए आउटपुट के साथ।

+3

जहां तक ​​मुझे पता है, लिनक्स में, 'pthread_t'' स्ट्रक्चर पर्थ्रेड 'के लिए एक सूचक है, जिसमें' tid' सदस्य है। लेकिन मुझे इस जानकारी को पढ़ने के लिए कोई स्वीकार्य तरीका नहीं पता है। यदि आपके पास डीबग प्रतीकों उपलब्ध हैं, तो आप इस संरचना को 'ptype pthread' के साथ gdb में देख सकते हैं। केवल डीबग उद्देश्यों के लिए, आप 't & ((pthread *) 0) -> tid' के साथ 'tid' के ऑफसेट को पढ़ सकते हैं, फिर' pthread_t' से 'tid' पढ़ने के लिए प्रोग्राम में इस ऑफसेट का उपयोग करें। या आप "पोर्टेबल" होने के लिए कुछ बौने पाठक लाइब्रेरी के साथ प्रतीक फ़ाइल से ऑफ़सेट को पढ़ सकते हैं। – geza

+0

@geza वास्तव में बहुत दिलचस्प है, इस जानकारी के लिए धन्यवाद! – SergeyA

+0

यह धागे के कार्यान्वयन के नीचे निर्भर करता है। linuxthreads के साथ जुड़े प्रक्रिया आईडी हो सकती है, 'getpid' इसे वापस करना चाहिए। पॉज़िक्स थ्रेड नहीं हो सकता है, इसलिए 'गेटपिड' मुख्य प्रक्रिया के पिड को वापस कर देगा। इसे जांचें: https://stackoverflow.com/a/19677227/1143850 – Serge

उत्तर

3

एक (जटिल, गैर पोर्टेबल, लिनक्स विशेष, हल्के से विनाशकारी) struct pthread में देख के बिना tid के लिए मानचित्रण pthread_t की विधि इस प्रकार है:

  1. उपयोग pthread_setname_np एक धागा नाम कुछ अद्वितीय करने के लिए सेट करने के लिए।
  2. /proc/self/task की उप-निर्देशिकाओं पर Iterate और उनमें से प्रत्येक में comm नाम की फ़ाइल से एक पंक्ति पढ़ें।
  3. यदि रेखा केवल अद्वितीय स्ट्रिंग के बराबर होती है, तो उपनिर्देशिका नाम के अंतिम घटक से tid निकालें। यह आपका जवाब है।

थ्रेड नाम किसी भी चीज़ के लिए ओएस द्वारा उपयोग नहीं किया जाता है, इसलिए इसे बदलने के लिए सुरक्षित होना चाहिए। फिर भी आप इसे मूल रूप से उस मूल्य पर वापस सेट करना चाहते हैं (इसे प्राप्त करने के लिए pthread_getname_np का उपयोग करें)।

+0

वास्तव में, मेरे धागे के नाम पहले से ही हैं, इसलिए यह दृष्टिकोण निश्चित रूप से विचार करने लायक है। स्वीकार करना। – SergeyA

-1

पाथ्रेड पॉज़िक्स थ्रेड हैं। pthread_t में आपके आर्किटेक्चर के आधार पर किसी प्रकार का लंबा टाइप किया गया है। यह वास्तव में ऊपर वर्णित एक आंतरिक संरचना pthread के लिए टाइप सूचक एक सूचक है।

यह उद्देश्य है कि संरचना pthread वापस नहीं किया गया है। थ्रेडिंग अंतर्निहित ओएस पर अत्यधिक निर्भर है। थ्रेड को सभी यूनिक्स स्वाद वाले ओएसई पर समान रूप से लागू नहीं किया जाता है। मुझे विश्वास नहीं है कि गेटिड एक पॉज़िक्स फ़ंक्शन है, मुझे विश्वास है कि यह लिनक्स विशिष्ट है।

आप struct pthread की linux विशिष्ट कार्यान्वयन के लिए glibc/NPTL स्रोत कोड पर एक नज़र हो सकता है https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca

देखें लेकिन मेरा मानना ​​है कि क्या आप के लिए getpid है देख रहे हैं। यह प्रक्रिया आईडी और आईडी थ्रेड नहीं

संबंधित मुद्दे