जागता क्यों है जब एक पाइप से पढ़कर पूरी बफरिंग करते हैं


23

मैं एक nmea तार भेजने वाले एक जीपीएस डिवाइस से जुड़े सीरियल पोर्ट से पढ़ रहा हूं।

मेरी बात को स्पष्ट करने के लिए एक सरल आह्वान:

  $ awk '{ print $0 }' /dev/ttyPSC9 
  GPGGA,073651.000,6310.1043,N,01436.1539,E,1,07,1.0,340.2,M,33.3,M,,0000*56
  $GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
  $GPRMC,073651.000,A,6310.1043,N,01436.1539,E,0.42,163.42,070312,,,A*67
  GPGGA,073652.000,6310.1043,N,01436.1540,E,1,07,1.0,339.2,M,33.3,M,,0000*55
  $GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39

अगर मैं इसके बजाय एक पाइप से पढ़ने की कोशिश करता हूं, तो स्टेकआउट भेजने से पहले इनपुट को जागृत करें।

$ cat /dev/ttyPSC9 | awk '{ print $0 }'
<long pause>
GPGGA,073651.000,6310.1043,N,01436.1539,E,1,07,1.0,340.2,M,33.3,M,,0000*56
$GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
$GPRMC,073651.000,A,6310.1043,N,01436.1539,E,0.42,163.42,070312,,,A*67
GPGGA,073652.000,6310.1043,N,01436.1540,E,1,07,1.0,339.2,M,33.3,M,,0000*55
$GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39

मैं बफरिंग से कैसे बच सकता हूं?

संपादित करें : काइल जोन्स ने सुझाव दिया कि बिल्ली इसका उत्पादन बफ़र कर रही है, लेकिन ऐसा प्रतीत नहीं होता है:

$ strace cat /dev/ttyPSC9 | awk '{ print $0 }'
write(1, "2,"..., 2)                    = 2
read(3, "E"..., 4096)                   = 1
write(1, "E"..., 1)                     = 1
read(3, ",0"..., 4096)                  = 2

जब मैं इसके बारे में सोचता हूं: मैंने सोचा कि एक कार्यक्रम टर्मिनल के लिए लिखते समय लाइन बफ़रिंग का उपयोग करता था और अन्य सभी मामलों के लिए "नियमित बफरिंग"। तो फिर, बिल्ली अधिक शौकीन क्यों नहीं है? क्या सीरियल पोर्ट सिग्नलिंग EOF है? फिर बिल्ली को समाप्त क्यों नहीं किया जाता है?


1
BashFAQ 009 उपयोगी हो सकता है।
jw013

@ jw013: लिंक के लिए धन्यवाद, बश में बफ़रिंग कैसे काम करता है, इसका एक बड़ा योग।
डैनियल नेस्लांड

जवाबों:


10

यह awk में बफरिंग की संभावना है, बिल्ली की नहीं। पहले मामले में, awk का मानना ​​है कि यह संवादात्मक है क्योंकि इसके इनपुट और आउटपुट TTYs हैं (भले ही वे अलग-अलग TTYs हैं - मुझे लगता है कि awk जाँच नहीं कर रहा है)। दूसरे में, इनपुट एक पाइप है इसलिए यह गैर-अंतःक्रियात्मक रूप से चलता है।

आपको अपने जाग कार्यक्रम में स्पष्ट रूप से फ्लश करने की आवश्यकता होगी। यह पोर्टेबल नहीं है, हालांकि।

अधिक फ्लश और आउटपुट फ्लश करने के विवरण के लिए, पढ़ें: http://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html


6
स्पष्टीकरण के लिए धन्यवाद। awk -W interactive '{print $0}'चाल करने के लिए प्रकट होता है। 'W interactiveविकल्प मेरी awk संस्करण (mawk 1.2) पर उपलब्ध है, लेकिन मुझे पता नहीं है अगर यह एक मानक विकल्प नहीं है।
डैनियल नेस्लांड

1
@dannas -Wमें नहीं है के लिए POSIX मानकawk । मुझे यकीन नहीं है कि अगर आपको अधिकतम पोर्टेबिलिटी की आवश्यकता है तो क्या करें।
jw013

मैं इस उत्तर को स्वीकार कर रहा हूं क्योंकि यह बताता है कि awk मेरे बफ़रिंग में पूर्ण बफ़रिंग कर रहा है, बजाय लाइन बफ़रिंग के - यह जाँचता है कि इनपुट एक ट्टी के साथ-साथ आउटपुट भी है। मैंने केवल सोचा था कि यह आउटपुट की जांच करेगा।
डैनियल नेल्सन

@ jw013: मानक देखने के लिए धन्यवाद। मेरे लिए, मैं बस यह समझना चाहता था कि जाग पूरी बफ़रिंग क्यों कर रहा था और मुझे लगता है कि मैं अभी करता हूं।
डैनियल नेल्सन

@dannas मैं पुष्टि कर सकता हूं कि -W interactiveकम से कम उबंटू 12.04 (और संभवत: नए) awk के वितरण में समर्थित है, जो कि mawk है।
जेसन सी

37

मुझे पता है कि यह एक पुराना सवाल है, लेकिन एक-लाइनर उन लोगों की मदद कर सकता है जो यहां खोज करने आते हैं:

cat /dev/ttyPSC9 | awk '{ print $0; system("")}'

system("")चाल करता है, और POSIX आज्ञाकारी है। गैर-पॉज़िक्स सिस्टम: सावधान रहें।

एक अधिक विशिष्ट फ़ंक्शन मौजूद fflush()है जो समान है, लेकिन awk के पुराने संस्करणों में उपलब्ध नहीं है।

डॉक्स से उपयोग के संबंध में एक महत्वपूर्ण जानकारी system(""):

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


यह मेरे लिए काम किया
सुगन्धित

3
मेरा awkन तो कुछ करता है fflush()और न ही system("")। मेरे gawkयह हालांकि सम्मानित किया।
Krzysztof Jabłoński
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.