2009-11-06 17 views
5

के लिए समकक्ष कांटा/क्रोट समकक्ष मैंने लिनक्स पर चल रहे सी में एक छोटा कस्टम वेब सर्वर एप्लिकेशन लिखा है। जब एप्लिकेशन को अनुरोध प्राप्त होता है तो यह फोर्क() को कॉल करता है और अनुरोध को एक अलग प्रक्रिया में संभालता है, जिसे एक विशिष्ट निर्देशिका में घुमाया जाता है जिसमें फाइलें उपलब्ध हैं जिन्हें मैं उपलब्ध करना चाहता हूं।विंडोज सर्वर अनुप्रयोग

मैं एप्लिकेशन को विंडोज़ पर पोर्ट करना चाहता हूं, लेकिन इस मंच पर न तो कांटा() और न ही क्रोट() उपलब्ध हैं, और ऐसा कोई प्रत्यक्ष समकक्ष प्रतीत नहीं होता है। क्या आप मुझे कोड के एक साधारण (और अधिमानतः अच्छी तरह लिखित) उदाहरण के लिए इंगित कर सकते हैं जो विंडोज़ में यह कार्यक्षमता प्रदान करेगा? मेरा सी इतना अच्छा नहीं है, तो बेहतर बेहतर है।

+0

उत्तर अब तक इंगित करते हैं कि फोर्क() के लिए कोई आसान विकल्प नहीं है, मुझे अलग-अलग उपयोग करने पर विचार करने में खुशी है एक नई प्रक्रिया को फोर्क करने के बजाय धागे, लेकिन अभी भी एक कोड उदाहरण पसंद करेंगे। ऐसे कई वेब सर्वर हैं जो विंडोज़ (जैसे अपाचे) पर चलते हैं, जो इस समस्या के फोर्क() और क्रोट() दोनों भागों को संबोधित करते हैं, आमतौर पर उठाए गए दृष्टिकोण का एक संक्षिप्त सारांश स्वीकार करेंगे और प्रासंगिक भागों से लिंक अपाचे (या अन्य) स्रोत का। – codebox

+0

आपकी टिप्पणी को देखते हुए, मैं सुझाव दूंगा कि आप सिग्विन नमूना स्रोत पर अपना कोड आधार नहीं बनाते हैं, बल्कि इसके लिए विवरणों का ख्याल रखने के लिए अपाचे पोर्टेबल रनटाइम लाइब्रेरी का उपयोग करें। –

+0

मुझे भी लगता है कि आपको कुछ पुस्तकालय के साथ जाना चाहिए। यह भी देखें: http://www.gnu.org/software/libmicrohttpd/ - विंडोज और यूनिक्स दोनों के लिए समर्थन के साथ एक HTTP सर्वर लाइब्रेरी। आपके प्रोग्राम में वेब सर्वर कार्यक्षमता को एम्बेड करने के लिए प्रयुक्त होता है। http://abyss.sourceforge.net/ - जीत/यूनिक्स के लिए वेब सर्वर भी, आप धागे और प्रक्रियाओं के बारे में भूल सकते हैं और गैर-अवरुद्ध आईओ का उपयोग कर सकते हैं। इस तरह आपको केवल एक प्रक्रिया की आवश्यकता होती है, इसके बजाय आप किसी सूची या सरणी में कनेक्शन का ट्रैक रखते हैं। एक उदाहरण: http://www.cubicsky.com/files/shinyhttpd-0.1.3-sc.c.tar.gz –

उत्तर

9

सबसे पहले, chroot के विंडोज समतुल्य RUNAS है जो documented here है। यदि आपको किसी प्रोग्राम से ऐसा करने की आवश्यकता है, तो this C++ source code का अध्ययन करने से आपको यह समझने में सहायता करनी चाहिए कि Windows API का उपयोग कैसे करें। यह chroot() जैसा बिल्कुल ठीक नहीं है लेकिन विंडोज लोक इसका उपयोग बहुत सीमित अनुमतियों वाले उपयोगकर्ता को बनाकर क्रोट जेल की तरह कुछ बनाने के लिए करते हैं और केवल उस उपयोगकर्ता को एप्लिकेशन फ़ोल्डर पर अनुमति पढ़ने की अनुमति देते हैं, और डेटा के लिए एक फ़ोल्डर पर अनुमति लिखते हैं।

शायद आप विंडोज़ पर fork() को बिल्कुल अनुकरण नहीं करना चाहते हैं क्योंकि ऐसा लगता है कि आपको अब तक जाने की आवश्यकता नहीं है। प्रक्रिया बनाने के लिए विंडोज एपीआई को समझने के लिए और यह fork() से अलग कैसे है, Mr. Peabody Explains fork() देखें। Cygwin's fork implementation के लिए वास्तविक वर्तमान स्रोत कोड आपको कला की वर्तमान स्थिति दिखाता है।

CreateProcess() और CreateThread() के लिए माइक्रोसॉफ्ट प्रलेखन उनके बीच मतभेदों के बारे में अधिक जानकारी देखने के लिए जगह है।

और आखिरकार, यदि आप सभी नट-किरकिरा प्लेटफ़ॉर्म विवरणों को नहीं सीखना चाहते हैं, तो बस पोर्टेबल प्रोग्राम लिखें जो विंडोज और यूनिक्स पर काम करते हैं, क्यों न केवल Apache Portable Runtime library का उपयोग करें। Here are some docs on process creation with some sample code, सी में, एक नई प्रक्रिया बनाने के लिए।

+1

यह 'chroot() 'नहीं है,' chroot' आपकी रूट निर्देशिका को बदलता है, न कि जिस उपयोगकर्ता को आप – Hasturkun

+4

के रूप में पहचाना जाता है, आप सही नहीं हैं, यह chroot() नहीं है क्योंकि Windows में chroot() नहीं है, लेकिन RUNAS.EXE क्या है विंडोज़ लोग यूनिक्स क्रोट जेल के समान कुछ बनाने के लिए उपयोग करते हैं। –

+3

रनस एक क्रोट जेल के समान नहीं है। –

3

विंडोज़ पर fork() जैसी कोई चीज़ नहीं है। आपको CreateProcess() पर कॉल करने की आवश्यकता है - यह एक अलग प्रक्रिया शुरू करेगा (अधिकतर fork() को कॉल करने के बराबर और तत्काल exec() स्पॉन्ड प्रक्रिया के लिए) और पैरामीटर को किसी भी तरह से पास कर देगा। चूंकि आपके पास एक समर्पित निर्देशिका में प्रक्रिया करने के लिए सभी डेटा होने लगते हैं, इसलिए आप CreateProcess() पैरामीटर का उपयोग कर सकते हैं - बस उस निर्देशिका पथ को पास करें जिसका आपने पहले chroot() के साथ उपयोग किया था।

+1

ध्यान दें कि 'lpCurrentDirectory' chdir(), chroot() से मेल नहीं खाता है। –

+0

धन्यवाद, लेकिन यह बिल्कुल वही नहीं है जो मुझे चाहिए - क्रोट का उपयोग करने का मुख्य कारण सुरक्षा है (फाइल सिस्टम पर कहीं और फ़ाइलों तक पहुंचने के लिए उनके अनुरोध url में ../ .. का उपयोग कर किसी को रोकता है) और वर्तमान निर्देशिका को सेट नहीं करता है इसे प्रदान करें। मेरे पास स्मृति में बहुत सारे मूल्य भी हैं जिन्हें फोर्कड प्रक्रिया द्वारा जरूरी है, afaik exec के माध्यम से इन्हें पास करने का एकमात्र तरीका कमांड लाइन तर्क के रूप में होगा, और मैं वहां जाना नहीं चाहता ... – codebox

+2

ठीक है, फिर से फोर्क() जैसी कोई चीज़ नहीं है जो विंडोज़ पर प्रक्रिया को डुप्लिकेट करेगी। आपको किसी भी तरह के आईपीसी का उपयोग करना होगा, इसलिए शायद कमांड लाइन के रूप में या अस्थायी फ़ाइल के माध्यम से गुजरना सबसे आसान तरीका है। Chroot() के लिए आप निम्न कार्य कर सकते हैं: कार्यकर्ता प्रक्रियाओं को चलाने के लिए एक अलग खाता बनाएं जिसमें अस्थायी फ़ोल्डर को छोड़कर और उस खाते के अंतर्गत कार्यकर्ता प्रक्रिया को चलाने के लिए कोई अनुमति नहीं होगी। – sharptooth

0

फोर्क/क्रोट का उपयोग करना यह नहीं है कि विंडोज़ पर चीजें कैसे की जाती हैं। यदि आप सबप्रोसेसेस में सुरक्षा के बारे में चिंतित हैं, तो शायद वर्चुअलाइजेशन या सैंडबॉक्सिंग का कुछ रूप आप उपयोग करना चाहते हैं। उपप्रोसेसर को जटिल जानकारी पास करना आरपीसी-समाधान के कुछ रूपों द्वारा किया जा सकता है।

यह मुझे लगता है जैसे आपने यूनिक्स तरीके से अपना एप्लिकेशन डिज़ाइन किया है, और अब आप कुछ भी बदलने के बिना विंडोज़ में चलना चाहते हैं। उस स्थिति में, आप Cygwin का उपयोग करने पर विचार करना चाहेंगे, लेकिन मुझे यकीन नहीं है कि सिगविन chroot का अनुकरण कैसे करता है।

+1

हां, सिगविन क्रोट है। –

2

ऐसा करने का सबसे आसान तरीका Cygwin का उपयोग कर रहा है, विंडोज के लिए मुफ्त यूनिक्स इम्यूलेशन परत। इसे डाउनलोड करें और एक पूर्ण विकास पर्यावरण स्थापित करें। (इंस्टॉलर में चुनें।) यदि आप भाग्यशाली हैं, तो आप अपने प्रोग्राम को संकलित करने में सक्षम होंगे, बिल्कुल कोई बदलाव नहीं।

बेशक डाउनसाइड्स हैं और कुछ इस "धोखाधड़ी" पर विचार कर सकते हैं लेकिन आपने सबसे सरल समाधान के लिए कहा है।

+1

मेरी समझ यह है कि साइगविन की क्रोट जेल सही नहीं है। एक गैर सिग्विन संकलित कार्य टूट सकता है। –

+0

संजय, आप शायद सही हैं, लेकिन अधिकांश उद्देश्यों के लिए, इसे काम करना चाहिए। –

0

एसयूए (यूनिक्स के लिए उर्फ ​​विंडोज सेवाएं) पर विचार करें। पोर्ट अनुप्रयोगों के लिए आपको लगभग हर चीज की आवश्यकता है।

man chroot(interix)

1

एक संगतता फ्रेमवर्क (Interix, Cygwin, ...) आप बात की इस तरह के लिए Windows का प्रयोग करते हुए देख रहे हैं का उपयोग कर के बिना।

कांटा/vfork यूनिक्स पर एक सस्ता ऑपरेशन है, यही कारण है कि इसका उपयोग बहु-थ्रेडिंग की तुलना में अक्सर किया जाता है। विंडोज समकक्ष - CreateProcess() - तुलनात्मक रूप से एक महंगा संचालन है, और इस कारण से आपको CreateThread() के साथ बनाने के बजाय धागे का उपयोग करना चाहिए। CreateThread() के लिए वहां बहुत सारे उदाहरण कोड हैं।

chroot() के संदर्भ में, विंडोज़ में यह अवधारणा नहीं है। वहां पुस्तकालय हैं जो आपको आवश्यकतानुसार अनुकरण करने का दावा करते हैं। हालांकि यह निर्भर करता है कि आप पहली जगह क्यों चिल्लाना चाहते हैं।

टिप्पणियां पढ़ना, अगर यह ../../../../ (आदि) के साथ पेड़ पर जाने से रोकने के लिए है, तो क्रोट नौकरी करेगा, लेकिन यह पहले स्थान पर इनपुट पार्स करने और यह सुनिश्चित करने के लिए कोई विकल्प नहीं है कि यह सौभाग्य है: यानी, यदि भी कई माता-पिता निर्दिष्ट हैं, उपयोगकर्ता को एक ज्ञात रूट निर्देशिका में लॉक करें। अपाचे लगभग निश्चित रूप से ऐसा करता है क्योंकि मुझे अपाचे के लिए काम करने के लिए कभी भी क्रोट() वातावरण बनाना नहीं था ...

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