2009-08-03 9 views
5

में केवल एक थ्रेड के यूआईडी/जीआईडी ​​को बदलें एक मल्टीथ्रेड प्रक्रिया में केवल एक थ्रेड के यूआईडी/जीआईडी ​​को बदलने का कोई तरीका है?लिनक्स

इसका कारण फ़ाइल-सेवारत अनुप्रयोग लिख रहा है - एसीएल और कोटा लागू नहीं किया जाता है जब तक कि कॉलर का यूआईडी/गीड सही उपयोगकर्ता पर सेट न हो, नई फाइल/निर्देशिका सही यूआईडी/ग्रिड के साथ नहीं बनाई जाती आदि

नेटवर्क अनुप्रयोग आमतौर पर शुरुआत में फोर्क() खुद को अलग कर सकते हैं और अलग-अलग प्रक्रिया में प्रत्येक उपयोगकर्ता अनुरोध को संसाधित कर सकते हैं। यदि साझा डेटा की आवश्यकता है, तो इसे किसी प्रकार की साझा मेमोरी से गुज़रना होगा। हालांकि, उदा। डिफ़ॉल्ट रूप से FUSE (लिनक्स उपयोगकर्ता फाइल सिस्टम) मल्टीथ्रेडिंग का उपयोग करता है और पायथन बाइंडिंग के साथ संयोजन में यह एक फोर्किंग मॉडल का उपयोग करने का प्रयास करने के लिए व्यावहारिक नहीं होगा।

पूरी प्रक्रिया के लिए 'सुसंगत' यूआईडी पॉज़िक्स मानक के अनुसार प्रतीत होता है, हालांकि पुराने लिनक्स ने पॉज़िक्स का पालन नहीं किया और विभिन्न धागे के लिए अलग-अलग यूआईडी की अनुमति दी। नए कर्नेल POSIX का पालन करना प्रतीत होता है, क्या पुराना 'टूटा हुआ' व्यवहार करने की अनुमति देने का कोई तरीका है?

उत्तर

5

क्या आपने जांच की है कि setfsuid()/setfsgid() प्रति-थ्रेड या प्रति-प्रक्रिया हैं? वे विशेष रूप से इस उपयोग के मामले (फ़ाइल सर्वर) के लिए डिज़ाइन किए गए हैं।

+0

यह बेहतर है - मैंने जांच की है और आश्चर्य की बात है कि वे वास्तव में प्रति-थ्रेड हैं। यह शायद पसंदीदा तरीका होगा। हालांकि - जिस कारण से मैंने इसका परीक्षण नहीं किया है, वह कोटा() और एक्सेस() काम नहीं करता है। अन्य चीजें काम करती हैं - तो शायद यह लिनक्स बग है। – ondra

+0

हां, यह एक बग की तरह लगता है, क्योंकि sys_setfsuid() के लिए कर्नेल कोड में टिप्पणियों का विशेष रूप से उपयोग() ... – caf

+0

@ ओन्ड्रेज, कृपया कोड (या इसके लिए एक लिंक) पोस्ट करें, यह दर्शाता है कि 'fsuid' है , अन्य यूआईडी/जीआईडी ​​संरचनाओं के विपरीत, प्रति थ्रेड और प्रति प्रक्रिया नहीं। कृपया अपने कर्नेल और ग्लिबैक संस्करणों के साथ-साथ आपके थ्रेडिंग कार्यान्वयन (एनपीटीएल, लिनक्स थ्रेड, ओन्ड्रेज थ्रेड, इत्यादि) भी निर्दिष्ट करें। – pilcrow

5

केवल एक थ्रेड के लिए यूआईडी को बदलने के लिए आपको सीधे सिस्कोल का उपयोग करने की आवश्यकता है: syscall (SYS_setresuid, ...); Libc फ़ंक्शन setresuid() सभी थ्रेड के लिए सिंक्रनाइज़ करेगा (एक सिंगल का उपयोग करके जो यह सभी धागे को भेजता है)!