আমি এক্সকোড থেকে "ভাঙা পাইপ" ত্রুটিটি একবারে অনেক বেশি পেয়েছি। পাইপ আসলে কী তা জানতে এখন আমি আগ্রহী।
"পাইপ" ধারণাটি কী এবং কীভাবে এটি "ভাঙ্গা" হতে পারে?
আমি এক্সকোড থেকে "ভাঙা পাইপ" ত্রুটিটি একবারে অনেক বেশি পেয়েছি। পাইপ আসলে কী তা জানতে এখন আমি আগ্রহী।
"পাইপ" ধারণাটি কী এবং কীভাবে এটি "ভাঙ্গা" হতে পারে?
উত্তর:
একটি পাইপ হ'ল একটি ইন্টারপ্রেসেস যোগাযোগ (আইপিসি) প্রক্রিয়া যা কোনও প্রক্রিয়াটির স্ট্যান্ডার্ড আউটপুটটিকে অন্যটির স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত করতে ব্যবহৃত হয়।
"প্যাক্স" শব্দের জন্য আপনি যখন কোনও ফাইল অনুসন্ধান করতে চান তার একটি উদাহরণ:
cat filename | grep pax
এবং হ্যাঁ, আমি জানি আপনি grep
সরাসরি ফাইলটি করতে পারেন তবে এটি কীভাবে এটি কাজ করে তা ব্যাখ্যা করে না, এটি কী করে?
এটি cat
কমান্ডের স্ট্যান্ডার্ড আউটপুটকে কমান্ডের স্ট্যান্ডার্ড ইনপুটকে সংযুক্ত করে grep
। cat
ফাইলের সামগ্রীগুলি তার স্ট্যান্ডার্ড আউটপুটে প্রেরণ করে এবং grep
এর স্ট্যান্ডার্ড ইনপুট থেকে তার ফাইলটি (এই ক্ষেত্রে) পড়ে। এই জাতীয় প্রক্রিয়াগুলিকে একসাথে সংযুক্ত করে, আপনি নিজেরাই তৈরি করতে পারেন যে কোনও সংখ্যক পাইপ সেগমেন্ট সমন্বিত tools ভালো জিনিস:
show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20
একটি ভাঙ্গা পাইপ হ'ল যেখানে (সাধারণত) তথ্য প্রাপক সংযোগটি বন্ধ করে দিয়ে থাকে যখন প্রেরক এখনও স্টাফ প্রেরণের চেষ্টা করে।
উদাহরণস্বরূপ, যদি আপনি পেজার প্রোগ্রামের মাধ্যমে একটি বড় ফাইল প্রেরণ করেন (এটি একবারে একটি পৃষ্ঠা দেখতে):
cat myfile | pager
এবং তারপরে একটি করুন CTRL-BREAK, এর ফলে pager
প্রক্রিয়াটি এর ইনপুট পাইপটি cat
ব্যবহার শেষ করার আগে বন্ধ করে দিতে পারে। এই ভাঙ্গা পাইপ পাওয়ার জন্য এটি একটি সম্ভাবনা।
গুপ্তচর গুগল অনুসন্ধান থেকে , এই বিশেষ সমস্যাটি অ্যাডহক মোতায়েনের সাথে সম্পর্কিত বলে মনে হয় এবং প্রদত্ত সমাধানগুলিতে সাধারণত আপনার বেশিরভাগ সফ্টওয়্যার থেকে বেরিয়ে আসা এবং আপনার বেশিরভাগ ডিভাইসগুলি রিবুট করা অন্তর্ভুক্ত।
বিষয়টি সম্ভবত অ্যাপলকে জানাতে যথেষ্ট গুরুতর। এটির বিষয়ে যত বেশি বিকাশকারীরা অভিযোগ করবেন তত সম্ভবত এটি সমাধানের জন্য কিছু করা হবে।
pr -e4 -n ten-thousand-lines.c | sed 10q
একটি ভাঙা পাইপ দিয়ে শেষ হয়। কিনা pr
বিরক্তির তোমাকে বলতে বুঝেছি যে SIGPIPE সংকেত অন্য ব্যাপার নয়; এটি সহজেই সিগন্যালের ফলাফল হিসাবে প্রস্থান করতে পারে (একটি শূন্য-বহির্গমন স্থিতি তৈরি করে)।
|
চরিত্র প্রায়ই একটি নল বলা হয়। বিভিন্ন ইউনিক্স শেল (যা আমি জানি) এটিতে একটি কমান্ডের আউটপুটটিকে অন্যের ইনপুটটিতে পাইপ করতে ব্যবহার করা যেতে পারে।
cat myfile.txt | head
head
কমান্ড শুধুমাত্র তার ইনপুট প্রথম কয়েকটি পংক্তি দেখায়। এই মুহুর্তে, এটি তার ইনপুটটি বন্ধ করে দেয়। এটি কমান্ডটির জন্য একটি সমস্যা তৈরি করে যা ইনপুট তৈরি করে। এটা কোথায় লিখতে হবে? যখনই আমাদের এই পরিস্থিতি হয়, বা যখন পাঠকের মধ্য দিয়ে লেখার প্রক্রিয়াটি শেষ হয় তখনই এটিকে "ভাঙা পাইপ" বলা হয়।
cat
কমান্ডটি চিরকাল স্থায়ী হওয়া থেকে রোধ করতে , ইউনিক্স মান একটি বিশেষ সংকেত ( সাইনপাইপ , সংকেত 13 ) সংজ্ঞা দেয় যা এটি প্রেরণ করে cat
। এই সংকেতটির জন্য ডিফল্ট ক্রিয়াটি প্রক্রিয়াটি হ'ল, যা cat
শেষটিকে সুন্দর করে তোলে ।
দেখে মনে হচ্ছে আপনি যে অ্যাপ্লিকেশনটি ব্যবহার করছেন সেটিতে সিগপাইপ সহ সমস্ত সিগন্যালের জন্য একটি সিগন্যাল হ্যান্ডলার ইনস্টল করা আছে, যা আপনি দেখতে পাচ্ছেন এমন সামান্য পপআপ বার্তা তৈরি করে।
এই ত্রুটিটি প্রায়শই প্রায়শই উঠে আসে বলে মনে হয়। /programming/490366/ad-hoc-dep مامور-issue-putpkt-writ-failed-broken-pype "" এটি আপনার ফোনের সাথে কথা বলার জন্য এক্সকোডের অভ্যন্তরীণ ত্রুটি। মানে আপনি কোনও ভুল করেছেন, এটি ডেভলপমেন্ট সিস্টেমে একটি বাগ "
পাইপ ইউনিক্স সিস্টেমগুলিতে আইপিসি প্রক্রিয়া। একটি পাইপের দুটি প্রান্ত, একটি পড়ার শেষ এবং লেখার শেষ থাকে। লেখার প্রান্তে লেখা ডেটাটি পড়ার শেষ থেকে পড়তে পারে এবং এটি যেভাবে লেখা হয়েছিল সেভাবে বেরিয়ে আসে।
ইউনিক্স কমান্ড লাইন বিশ্বে পাইপ হুকিং প্রোগ্রামগুলির একসাথে একটি কাজ করার জন্য খুব সাধারণ উপায়। উদাহরণস্বরূপ sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'
, ফাইলটিতে fred.txt
স্ট্রিংয়ের সমস্ত উদাহরণ স্ট্রিংয়ের foo
সাথে প্রতিস্থাপন করবে এবং bar
তারপরে লাইনগুলির জন্য ফলাফলটি অনুসন্ধান করবে যার bar
পরে কিছু সংখ্যক অক্ষর থাকবে baz
।
এটি অবশ্যই মারাত্মক উপকারী বলে মনে হচ্ছে না। তবে আমি নিশ্চিত যে আপনি যদি এটির বিষয়ে চিন্তা করেন তবে আপনি দেখতে পাচ্ছেন যে আপনি কীভাবে এটি সমস্ত ধরণের আকর্ষণীয় ব্যবহারগুলিতে রাখতে সক্ষম হতে পারেন, বিশেষত একবার আপনার মত প্রোগ্রাম awk
বা perl
আপনার নিষ্পত্তি করার পরে।
পাইপ সিস্টেমটি প্রথম থেকেই ইউনিক্সের একটি অংশ ছিল। এবং যদি আপনার পাইপলাইনের কোনও প্রক্রিয়াটি প্রস্থান করে তবে আপনি সাধারণত পাইপলাইনের সমস্ত প্রোগ্রাম প্রস্থান করতে চান। এর অর্থ হ'ল, ডিফল্টরূপে, কোনও পাইপতে যে প্রক্রিয়াটি পড়ে সেগুলি পড়ার শেষের প্রক্রিয়াটি শেষ হয়ে গিয়েছিল একটি SIGPIPE
সংকেত পাবে। এবং যদি এটি সেই সংকেতকে অবরুদ্ধ করে থাকে write
তবে পাইপটি 'ব্রেক' হয়েছে বলে ইঙ্গিত করে বিশেষ ধরণের ত্রুটি থাকলেও এটি ব্যর্থ হবে।
ডিফল্ট হ্যান্ডলিং SIGPIPE
হ'ল প্রক্রিয়াটি এটি গ্রহণ করে। এবং যদি এটি পাইপলাইনের 'হেড' না হয় তবে পুরো SIGPIPE
জিনিসটি চেইনের ব্যাক আপটি প্রচার করে।
এক্সকোড যা অভিযোগ করছেন তা হ'ল এটি কোনও পাইপ দিয়ে কিছু করার জন্য কিছু উপ-প্রোগ্রাম শুরু করেছিল এবং সেই উপ-প্রোগ্রামটি পাইপটি ভাঙা অবস্থায় অপ্রত্যাশিতভাবে মারা গিয়েছিল ..
একটি "ভাঙা" পাইপটি এমন এক যেখানে একটি close()
প্রান্তটি 'd' হয়েছে এবং অন্যটি পড়ে বা লিখিত হয়েছে। উদাহরণস্বরূপ, নিম্নলিখিত শেল কমান্ডে:
cat foo | less
cat
প্রক্রিয়া নল লেখার শেষ ঝুলিতে, এবং less
প্রক্রিয়া এক পড়া চালিয়ে যান। যদি পাঠক প্রক্রিয়াটি পাইপটি বন্ধ করে দেয় তবে পাইপটি ভাঙ্গা হয় (এবং তাই অকেজো); লেখক প্রক্রিয়া অপারেটিং সিস্টেম থেকে "ভাঙা পাইপ" ত্রুটি পাবেন।
cat
স্পষ্টভাবে এটি শেষ হওয়ার সাথে সাথেই হবে), পাঠক কেবল ফাইলের একটি শেষের শেষ দেখতে পাবে।