"প্রস্থান (-1)" কোথা থেকে এসেছে?


22

আমি ইন্টারনেট যে ব্যবহার করার প্রস্তাব দিই উপর উত্তরাধিকার সফ্টওয়্যার ও খারাপ টিউটোরিয়াল অনেকটা দেখতে exit(-1), return -1বা অনুরূপ "অস্বাভাবিক পরিসমাপ্তি" প্রতিনিধিত্ব করতে। কমপক্ষে POSIX এ সমস্যাটি হ'ল -1কোনও বৈধ স্থিতির কোড এবং কখনও নয়। man 3 exitচিত্রিত করে যে পিতামাতার exit()মান ফেরত দেয় status & 0377, যার অর্থ -1হয় 255। নন-পসিক্স সিস্টেমে EXIT_FAILUREবহনযোগ্যতার জন্য প্রস্তাবিত। তবে আমি কখনই দেখতে পাচ্ছি না "-1 এর অর্থ" অস্বাভাবিক সমাপ্তি "" এক্সআইআইএফএইফএলইআর 1 ব্যতীত অন্য কিছু হতে পারে "যা এই ইঙ্গিত দেয় যে তারা" -1 "এমনকি নন-পসিক্স সিস্টেমে প্রচলিত believe

এখানে স্ট্যাক ওভারফ্লো প্রশ্নের একটি উদাহরণ যা এটি স্থায়ী করে। সফটওয়্যার "অবাস্তব নাটক" প্রোগ্রামের একটি উদাহরণ যা প্রোগ্রামটি বন্ধ করতে ব্যবহার exit(-1)করে। অনুশীলনে, এটি ইন্টারফেস করতে অসুবিধা সৃষ্টি করে systemd

এই অ্যান্টি-প্যাটার্নটি কোথা থেকে এল? এটি কিছু প্রসঙ্গে বৈধ?


1
"ইউনিক্সের মতো সিস্টেমে একটি শক্তিশালী কনভেনশন রয়েছে যে 0 এর একটি প্রস্থান স্থিতি সাফল্যকে নির্দেশ করে এবং কোনও শূন্য-বহির্গমন স্থিতি ব্যর্থতা বোঝায় ... এই কনভেনশনটি ইউনিক্স শেলগুলিতে খুব শক্ত হয়ে গেছে ..." ( শূন্য-বহির্গমন প্রস্থান পরিস্থিতি পরিষ্কার প্রস্থানের জন্য )
gnat

@gnat libc ম্যানুয়াল অনুসারে প্রস্থান স্থিতি 0 0 থেকে 255 পর্যন্ত অন্তর্ভুক্ত। যদি কোথাও এমন কোনও উত্তর পাওয়া যায় যা বলে যে নেতিবাচক মানগুলি এক পর্যায়ে বৈধ ছিল তবে আমি তা গ্রহণ করব তবে আমি এটি অত্যন্ত সন্দেহজনক বলে মনে করি।
ব্যবহারকারী 222973

1
@gnat "255" সহজেই একটি মধ্যে ফিট করে unsigned char
ব্যবহারকারী 222973


1
"জাভা" এ জিগ্যাট এ বাইট কোনও স্বাক্ষরবিহীন চর নয়, charএর মানগুলির পরিধি -128 থেকে 127 হওয়ায় এটি এর চেয়ে বেশি সমান Further আরও, আমি ইতিমধ্যে বলেছি "-1" আমার প্রশ্নবিদ্ধিতে "255" তে রূপান্তরিত হয় stated ।
ব্যবহারকারী 222973

উত্তর:


20

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

এটি কার্যকর কারণ যখন স্ক্রিপ্ট বা প্রোগ্রামগুলির একাধিক সম্ভাব্য প্রস্থান স্থিতি থাকে ( grepএকটি সাধারণ উদাহরণ দেখুন) অর্থবহুলগুলি সাধারণত সবচেয়ে ছোট সংখ্যায় অর্পণ করা হয়, "অজানা ত্রুটি" বা " বাতিল "যেহেতু এটি অর্থবহ স্থিতির মানের সাথে কখনও দ্বন্দ্ব হওয়ার সম্ভাবনা নেই।


গ্লিবিকে একটি উদাহরণ হিসাবে গ্রহণ করুন, যা কার্যকর exit()করে status &= 0xff-1 & 0xff255 নয় এমন একটি "শব্দের আকার" আছে ? অবশ্যই তা নয়, কারণ পুরো উদ্দেশ্যটি 0-255 এর পরিসরে ফিট করা। নির্বিশেষে, আপনার শেষ বাক্যটি বোঝা যায় না: ইউনিক্স সিস্টেমে স্ট্যাটাস কোড 128-255 এর বিশেষ উদ্দেশ্য রয়েছে।
ব্যবহারকারী 222973

2
প্রোগ্রামের প্রস্থান মানগুলির সাথে বাশের প্রস্থান মূল্য (যা 0-127, 128+ বিশেষ বাশ মান হচ্ছে) গুলিয়ে ফেলবেন না (যা 0-255, pubs.opengroup.org/onlinepubs/009695399/function/exit.html দেখুন )। আকার হিসাবে, মনে রাখবেন যে সি প্রোগ্রামাররা শুরু থেকেই একাধিক শব্দের মাপের (মূলত 12, 16 এবং 32 বিট) কাজ করে আসছে তাই আমরা স্বয়ংক্রিয়ভাবে এমন প্রতিমাগুলির জন্য চেষ্টা করি যা শব্দের আকার বিবেচনা করার প্রয়োজন হয় না। যেহেতু ইউনিক্স পিক্সিকে 2 দশক পূর্বে পূর্বাভাস দেয় সেখানে 8-বিটের সীমাবদ্ধতা সবসময় ছিল না তাই আমরা লিখলাম তাই তাতে কিছু আসে যায় না।
টড নায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.