2012-07-17 7 views
5

this post के अनुसार हाय, unbuffer एक छद्म टर्मिनल (पीटीआई) के माध्यम से एक कमांड से जुड़ता है, जो सिस्टम को एक इंटरैक्टिव प्रक्रिया के रूप में पेश करता है, इसलिए किसी भी स्टडआउट बफरिंग का उपयोग नहीं करता है।विंडोज पर अनबफर प्रोग्राम के बराबर क्या है?

मैं इस फ़ंक्शन का उपयोग विंडोज पर करना चाहता हूं। क्या मुझे पता है कि विंडोज़ पर unbuffer प्रोग्राम के बराबर क्या है? धन्यवाद।

+0

कोई समकक्ष नहीं है। विंडोज में छद्म टर्मिनलों नहीं हैं। –

+0

@ हैरी जोहानस्टन हाय हैरी, मैं बाहरी आदेशों को निष्पादित करने के लिए जावा का उपयोग करना चाहता हूं और 'वास्तविक समय में' stdout आउटपुट को पढ़ना चाहता हूं। कुछ .exe प्रोग्राम मुझे stdout बफरिंग की वजह से समस्या दे रहे हैं। जब प्रोग्राम अभी भी चल रहा है तो मुझे कोई स्टडआउट आउटपुट नहीं मिला। जब कार्यक्रम समाप्त हो जाता है, तो मुझे अचानक बहुत सारे स्टडआउट आउटपुट मिलते हैं। (यह प्रोग्राम वास्तविक समय stdout आउटपुट उत्पन्न करने में सक्षम है जब मैं इसे मैन्युअल रूप से कमांड प्रॉम्प्ट विंडो में चलाता हूं) यदि Windows में कोई छद्म टर्मिनल नहीं है तो मैं इस समस्या को कैसे हल कर सकता हूं? – userpal

+0

यह ऑपरेटिंग सिस्टम नहीं है जो बफरिंग करता है, यह एप्लिकेशन है। आपको .exe प्रोग्राम को प्रश्न में ठीक करने की आवश्यकता होगी ताकि वे अपने आउटपुट को बफर न करें। –

उत्तर

2

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

मुझे इस तरह के एप्लिकेशन को सोचने के लिए किसी भी समझदार तरीके से अवगत नहीं है एक कंसोल पर लिख रहा है जब यह वास्तव में एक पाइप को लिख रहा है।

सिद्धांत रूप में, यदि आप जानते हैं कि कितना डेटा अपेक्षित है, तो आप लिखने के लिए कंसोल बनाने के लिए console API functions का उपयोग कर सकते हैं और फिर कंसोल से आउटपुट पढ़ सकते हैं। लेकिन आप जावा से ऐसा नहीं कर सकते हैं, आपको इसे करने के लिए आपको एक सी एप्लीकेशन लिखना होगा।

इसी तरह, सिद्धांत रूप में यह संभवतः एक यूनिक्स छद्म-टर्मिनल के समतुल्य डिवाइस ड्राइवर को लिखना संभव हो सकता है, जो पाइप की तरह कार्य करता है लेकिन खुद को एक चरित्र-मोड डिवाइस के रूप में रिपोर्ट करता है। लेकिन डिवाइस ड्राइवरों को लिखने के लिए विशिष्ट विशेषज्ञता की आवश्यकता होती है, और उन्हें डिजिटल हस्ताक्षर किए जाने चाहिए, इसलिए जब तक कोई मौजूदा उत्पाद मौजूद न हो, तो यह दृष्टिकोण व्यवहार्य होने की संभावना नहीं है।

+0

एक मौजूदा विकल्प [com0com] (http://com0com.sourceforge.net/) null-modem एमुलेटर हो सकता है।(अगर मुझे सही याद है, सीरियल बंदरगाहों को आम तौर पर unbuffered के रूप में माना जाता है।) –

4

मैंने इस पर कुछ समय बिताया और सफल हुआ। मैंने शोध के दौरान इस ब्लॉग को पाया, और वापस आने का फैसला किया और अगले व्यक्ति को कुछ समय बचाने के लिए मेरा समाधान प्रदान किया। मैं एक झूठे ईमेल वाले अतिथि के रूप में प्रतिक्रिया दे रहा हूं इसलिए मैं बातचीत नहीं करूँगा, लेकिन कोई और जानकारी की आवश्यकता नहीं है।

जुला 18 '12 पर 19:41 हैरी जॉनसन पर लिखा है:

"सिद्धांत रूप में, यदि आप जानते हैं उम्मीद करना कितना डेटा, आप कंसोल एपीआई कार्यों का उपयोग आवेदन लिखने के लिए एक सांत्वना बनाने के लिए कर सकता है करने के लिए, और फिर कंसोल से आउटपुट पढ़ें। लेकिन आप जावा से ऐसा नहीं कर सकते हैं, आपको इसे करने के लिए आपको एक सी एप्लीकेशन लिखना होगा। "

बात यह है कि पहले से ही एक उपयोगिता है जो यह करता है। यह थोड़ा अलग उपयोग के लिए लिखा गया है, लेकिन इसे वांछित परिणाम प्रदान करने में लगाया जा सकता है। इसका उद्देश्य उद्देश्य एक विंडोज कंसोल ऐप को लिनक्स स्टाइल टीटी टर्मिनल के साथ बातचीत करने में सक्षम बनाना है। यह एक छिपे हुए कंसोल को चलाकर करता है और कंसोल बफर को सीधे एक्सेस करता है। यदि आपने इसका उपयोग करने की कोशिश की - तो आप असफल हो जाएंगे। मैं भाग्यशाली हो गया और पाया कि इस उपयोगिता के लिए अनियंत्रित स्विच हैं जो इसे सरल unbuffered आउटपुट प्रदान करने की अनुमति देगा। स्विच के बिना यह त्रुटि के साथ विफल रहता है - आउटपुट पाइप आउटपुट की कोशिश करते समय आउटपुट एक tty नहीं है।

उपयोगिता को Winpty कहा जाता है। आप इसे यहाँ प्राप्त कर सकते हैं:

https://github.com/rprichard/winpty/releases

अप्रलेखित स्विच यहां उल्लेख कर रहे हैं:

https://github.com/rprichard/winpty/issues/103

मैं MSYS2 संस्करण का उपयोग कर रहा हूँ। इसका उपयोग करने के लिए आपको msys-2.0.dll की आवश्यकता होगी।

सीधे शब्दों में चलाएँ:

winpty.exe -Xallow-non-tty -Xplain your_program.exe | receive_unbuffered_output.exe 

-Xallow-non-tty, पाइप उत्पादन

-Xplain की अनुमति देगा, जोड़ा लिनक्स टर्मिनल मुक्ति कोड निकाल देंगे (या वे कहा जाता है जो कुछ भी)

आवश्यक फ़ाइलों में कर रहे हैं:

winpty.exe 
winpty-agent.exe 
winpty.dll 
msys-2.0.dll 

winpt y-debugserver.exe - आवश्यक नहीं

+0

हाँ, यह काम करता है, इसे हल करने में मदद करता है: https://stackoverflow.com/questions/46443544/python-popen-sdtout-doesnt-get-all- -उत्पादन-जब-एक्स-विफल रहता है –

0

अस्वीकरण: मेरा उत्तर केवल एमएसवीसी का उपयोग करके संकलित निष्पादन योग्यों से संबंधित है।

बफरिंग नीति को माइक्रोसॉफ्ट सी रनटाइम (सीआरटी) लाइब्रेरी के अंदर कोड किया गया है। आप विवरण here सीख सकते हैं। यह आलेख कंसोल हैंडल का उपयोग करके सुझाव देता है और अनबफर आउटपुट प्राप्त करने के लिए कंसोल बफर में हेरफेर करता है।

हालांकि, वहाँ माइक्रोसॉफ्ट सी रनटाइम के अंदर एक गैर-दस्तावेजी सुविधा फ़ाइल वारिस के अपनी मूल प्रक्रिया STARTUPINFO संरचना के lpReserved2 और cbReserved2 फ़ील्ड का उपयोग कर से सीधे कुछ आंतरिक झंडे के साथ संभालती है। आप माइक्रोसॉफ्ट विजुअल स्टूडियो द्वारा प्रदान किए गए सीआरटी स्रोत कोड में विवरण पा सकते हैं। या गिटहब पर posfhnd जैसे कुछ की खोज करें।

हम एक पाइप संभाल प्रदान करते हैं और बच्चे की प्रक्रिया का इलाज है कि पाइप एक FILE_TYPE_CHAR संभाल के रूप में एक ही तरह से संभाल मूर्ख बच्चे की प्रक्रिया के लिए FOPEN | FDEV झंडे निर्दिष्ट करते हैं, करने के लिए इस गैर-दस्तावेजी सुविधा दोहन कर सकते हैं।

मेरे पास इस विधि को प्रदर्शित करने के लिए Python3 script काम कर रहा है।

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