পাইক থেকে পড়ার সময় কেন কেন বিশ্রী পূর্ণ বাফারিং করে


23

আমি জিপিএস ডিভাইসে সংযুক্ত সিরিয়াল পোর্ট থেকে এনএমএ স্ট্রিং প্রেরণ করছি।

আমার বক্তব্যটি বর্ণনা করার জন্য একটি সরল অনুরোধ:

  $ 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

যখন আমি এটি সম্পর্কে চিন্তা করি: আমি ভেবেছিলাম যে কোনও প্রোগ্রাম টার্মিনালে লেখার সময় লাইন বাফারিং এবং অন্যান্য সমস্ত ক্ষেত্রে "নিয়মিত বাফারিং" ব্যবহার করে। তাহলে, বিড়াল কেন বেশি বাফার করছে না? সিরিয়াল বন্দর ইওএফ সিগন্যাল করছে? তাহলে বিড়ালকে কেন শেষ করা হচ্ছে না?



@ jw013: লিঙ্কের জন্য ধন্যবাদ, বাশে কীভাবে বাফারিং কাজ করে তার একটি দুর্দান্ত পরিমাণ।
ড্যানিয়েল নস্লুন্ড

উত্তর:


10

এটি বিড়াল নয়, অজানাতে বাফার করছে। প্রথম ক্ষেত্রে, অর্ক বিশ্বাস করে যে এটি ইন্টারেক্টিভ কারণ এর ইনপুট এবং আউটপুট টিটিওয়াই (যদিও তারা আলাদা আলাদা টিটিওয়াই হয় - আমি অনুমান করছি যে বিশ্রী এটি পরীক্ষা করছে না)। দ্বিতীয়টিতে, ইনপুটটি একটি পাইপ তাই এটি ইন্টারঅ্যাক্টিভভাবে চালিত হয়।

আপনাকে আপনার awk প্রোগ্রামে স্পষ্টভাবে ফ্লাশ করা দরকার। যদিও এটি বহনযোগ্য নয়।

কীভাবে আউটপুট ফ্লাশ করবেন সে সম্পর্কে আরও পটভূমি এবং বিশদের জন্য পড়ুন: http://www.gnu.org/software/gawk/manual/html_node/I_002fO-Funtions.html


6
ব্যাখ্যা করার জন্য ধন্যবাদ. awk -W interactive '{print $0}'কৌতুক করতে দেখা যাচ্ছে। 'W interactiveবিকল্প আমার awk সংস্করণ (mawk 1.2) পাওয়া যায় কিন্তু আমি জানিনা যদি এটি একটি মান বিকল্প।
ড্যানিয়েল নস্লুন্ড

1
@dannas -Wনেই জন্য POSIX মানawk । আপনার সর্বাধিক বহনযোগ্যতার প্রয়োজন হলে আমি কী করব তা নিশ্চিত নই।
jw013

আমি এই উত্তরটি গ্রহণ করছি যেহেতু এটি ব্যাখ্যা করে যে কেন লাইন বাফারিংয়ের পরিবর্তে অজক আমার সম্পূর্ণ বাফারিং করছে - এটি যদি ইনপুটটি tty পাশাপাশি আউটপুট হয় তাও পরীক্ষা করে। আমি কেবল ভেবেছিলাম এটি আউটপুটটি পরীক্ষা করবে।
ড্যানিয়েল নস্লুন্ড

@ jw013: স্ট্যান্ডার্ডটি দেখার জন্য ধন্যবাদ। আমার জন্য, আমি ঠিক বুঝতে চেয়েছিলাম কেন কেন বিশ্রী পূর্ণ বাফারিং করছে এবং আমি মনে করি আমি এখনই করছি।
ড্যানিয়েল নস্লুন্ড

@ ইন্নাস আমি নিশ্চিত করতে পারি যে -W interactiveউবুন্টু 12.04 (এবং সম্ভবত আরও নতুন) জঞ্জের বিতরণে ম্যাকড যা কমপক্ষে সমর্থিত।
জেসন সি

37

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে একটি ওলাইনার যারা এখানে অনুসন্ধানে আসে তাদের সহায়তা করতে পারে:

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

system("")কৌতুকটি করে এবং পসিক্স অনুগত। নন-পিক্সিক সিস্টেম: সাবধান

এখানে আরও একটি নির্দিষ্ট ফাংশন বিদ্যমান রয়েছে fflush()যা একই কাজ করে তবে এডাব্লকের পুরানো সংস্করণগুলিতে পাওয়া যায় না।

এর ব্যবহার সম্পর্কিত ডক্স থেকে একটি গুরুত্বপূর্ণ তথ্য system(""):

গোক সিস্টেম () এর এই ব্যবহারটি () ফাংশনটিকে একটি বিশেষ কেস হিসাবে বিবেচনা করে এবং খালি কমান্ডের সাহায্যে শেল (বা অন্যান্য কমান্ড ইন্টারপ্রেটার) না চালাতে যথেষ্ট স্মার্ট smart অতএব, গাওয়াকের সাথে, এই প্রতিমাটি কেবল কার্যকর নয়, এটি দক্ষও।


এটি আমার পক্ষে কাজ করেছে
1:20 '

3
আমার awkউপর তন্ন তন্ন কিছু না fflush()কিংবা system("")। আমার gawkযদিও এটি সম্মানিত।
ক্রিজিসটফ জাবোওস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.