ব্রোকন পাইপ ত্রুটির কারণ কী?


84

আমি জানি যে পিয়ারের সকেটটি বন্ধ হয়ে গেলে ভাঙা পাইপের ত্রুটি নিক্ষেপ করা হয়।

তবে, আমার পরীক্ষায় আমি উল্লেখ করেছি যে পিয়ার সাইড বন্ধ থাকলে এই দিকে তাত্ক্ষণিকভাবে 'প্রেরণ' কলটি সর্বদা ভাঙ্গা পাইপের ত্রুটির দিকে পরিচালিত করে না।

যেমন:

পিয়ারের দিকে সকেটটি বন্ধ করার পরে (আমি পিয়ারকে মেরে ক্লোস ক্লোজ করার চেষ্টা করেছি এবং পিয়ারকে মেরে অস্বাভাবিক বন্ধ করে দেওয়ার চেষ্টা করেছি), যদি আমি 40 বাইট প্রেরণের চেষ্টা করি তবে আমি একটি ভাঙ্গা পাইপ পাই না, তবে, যদি আমি চেষ্টা করি 40000 বাইট প্রেরণ করুন তারপর এটি অবিলম্বে ভাঙা পাইপের ত্রুটি দেয়।

ঠিক কী কারণে ভাঙা পাইপ ঘটে এবং এর আচরণের পূর্বাভাস দেওয়া যায়?

উত্তর:


59

নেটওয়ার্কটি ঘনিষ্ঠভাবে পর্যবেক্ষণ করতে সময় নিতে পারে - বন্দরের জন্য নির্ধারিত প্যাকেটগুলি সমস্ত মৃত বলে ধরে নেওয়া হওয়ার আগে মোট সময়টি প্রায় ২ মিনিট (হ্যাঁ, মিনিট!) বন্ধ হওয়ার পরে হয়। ত্রুটির অবস্থাটি একটি পর্যায়ে সনাক্ত করা হয়েছে। একটি ছোট লেখার সাহায্যে আপনি সিস্টেমের এমটিইউর ভিতরে রয়েছেন, সুতরাং বার্তাটি প্রেরণের জন্য সারি করা আছে। একটি বড় লেখার সাথে, আপনি এমটিইউ থেকে আরও বড় এবং সিস্টেমটি সমস্যাটি দ্রুত স্পট করে। আপনি যদি সিগপাইপ সিগন্যালটিকে অগ্রাহ্য করেন, তবে ফাংশনগুলি কোনও ভাঙা পাইপে EPIPE ত্রুটিটি ফিরিয়ে দেবে - কোনও সময় সংযোগটির ভাঙা-নীস সনাক্ত করা হয়।


4
@varevarao: আমি মনে করি না যে সারি সারি প্রেরণ এবং নির্দিষ্ট বিরতিতে প্রেরণ করা একটি কাজ নয়। আপনার অ্যাপ্লিকেশন বিলম্বের সাথে বেঁচে থাকতে পারে যদি প্রেরণের জন্য এমটিইউর চেয়ে বেশি কিছু না থাকে ততক্ষণ ট্রান্সমিশনগুলির সন্ধান করানো একটি কার্যকরী হতে পারে।
জোনাথন লেফলার

11

সকেটের বর্তমান অবস্থা 'চালিয়ে রাখা' ক্রিয়াকলাপ দ্বারা নির্ধারিত হয়। আপনার ক্ষেত্রে এটি সম্ভব যে আপনি sendকলটি ইস্যু করার সময়, keep-aliveক্রিয়াকলাপটি জানায় যে সকেট সক্রিয় রয়েছে এবং তাই sendকলটি বাফারে প্রয়োজনীয় ডেটা (40 বাইট) লিখবে এবং কোনও ত্রুটি না দিয়ে ফিরে আসবে।

আপনি যখন আরও বড় অংশ পাঠাচ্ছেন তখন প্রেরণ কলটি ব্লকিং অবস্থায় চলে যায়।

প্রেরণ ম্যান পৃষ্ঠাটিও এটিকে নিশ্চিত করে:

যখন বার্তাটি সকেটের প্রেরণকারী বাফারের সাথে মানানসই হয় না, তবে পাঠান () সাধারণত ব্লক করুন, যদি না সকেটটি অ-ব্লকিং আই / ও মোডে স্থাপন না করা হয়। নন-ব্লকিং মোডে এটি এ ক্ষেত্রে EAGAIN ফিরিয়ে দেবে

সুতরাং, নিখরচায় উপলভ্য বাফারটির জন্য অবরুদ্ধ করার সময়, যদি কলারকে অবহিত করা হয় (রাখুন-জীবিত প্রক্রিয়া অনুসারে) অন্য প্রান্তটি আর উপস্থিত না থাকে তবে প্রেরণ কল ব্যর্থ হবে will

উল্লিখিত তথ্যের সাথে সঠিক দৃশ্যের পূর্বাভাস দেওয়া কঠিন, তবে আমি বিশ্বাস করি, এটি আপনার সমস্যার কারণ হতে হবে।


4
সকেটের বর্তমান অবস্থা ACK ক্রিয়াকলাপ দ্বারা পালন করা হয়। ক্যাপালাইভ হ'ল একটি ছোট উত্স ACC ক্রিয়াকলাপ এবং এটি ডিফল্টরূপে বন্ধ is
ব্যবহারকারী 207421

3

সম্ভবত 40 বাইট পাইপের বাফারের সাথে খাপ খায় এবং 40000 বাইট না?

সম্পাদনা করুন:

প্রেরণ প্রক্রিয়াটি যখন আপনি একটি বদ্ধ পাইপে লেখার চেষ্টা করবেন তখন একটি সিগপাইপ সিগন্যাল প্রেরণ করা হয়। সিগন্যাল কখন প্রেরণ করা হয় তা আমি জানি না বা পাইপ বাফার এর কী প্রভাব ফেলে। সিগিয়েশন কল দিয়ে সিগন্যাল আটকে রেখে আপনি পুনরুদ্ধার করতে পারবেন।


0

পিয়ারটি বন্ধ হয়ে গেলে, আপনি কেবল জানেন না যে এটি কেবল প্রেরণ বন্ধ রয়েছে বা পাঠানো এবং গ্রহণ করা উভয়ই বন্ধ রয়েছে T কারণ টিসিপি এটি অনুমতি দেয়, বিটিডব্লু, আপনার নিকট এবং শাটডাউনয়ের মধ্যে পার্থক্যটি জানা উচিত। যদি পিয়ার উভয়ই প্রেরণ এবং গ্রহণ করা বন্ধ করে দেয় তবে প্রথমে আপনি কিছু বাইট প্রেরণ করুন, এটি সফল হবে। তবে পিয়ার কার্নেল আপনাকে আরএসটি প্রেরণ করবে। সুতরাং পরবর্তীকালে আপনি কিছু বাইট প্রেরণ করেন, আপনার কর্নেল আপনাকে সিগপাইপ সিগন্যাল প্রেরণ করবে, আপনি যদি এই সংকেতটি ধরেন বা উপেক্ষা করেন, যখন আপনার প্রেরণ ফিরে আসে, আপনি কেবল ব্রোকন পাইপ ত্রুটি পেয়ে যান বা যদি আপনি না করেন তবে আপনার প্রোগ্রামটির ডিফল্ট আচরণটি ক্র্যাশ হয়ে যাচ্ছে is ।


-1

একটি নতুন নেটওয়ার্ক স্থাপনের পরে আমাদের ব্রোকন পাইপ ত্রুটি হয়েছিল। 9100 বন্দরটি উন্মুক্ত ছিল এবং টেলনেট পোর্ট 9100-র মাধ্যমে প্রিন্টারের সাথে সংযোগ স্থাপন করতে পারার বিষয়টি নিশ্চিত করার পরে, আমরা প্রিন্টার ড্রাইভারটিকে "এইচপি" থেকে "জেনেরিক পিডিএফ" হিসাবে পরিবর্তন করেছি, ভাঙ্গা পাইপের ত্রুটি চলে গেছে এবং সফলভাবে মুদ্রণ করতে সক্ষম হয়েছি।

(আরএইচইএল,, প্রিন্টারগুলি রিকো ব্র্যান্ড ছিল, এইচপি কনফিগারেশন পূর্ববর্তী এবং পূর্ববর্তী নেটওয়ার্কে কার্যকরী ছিল)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.