লিনাক্সের প্রস্থান কোডগুলির ন্যূনতম এবং সর্বাধিক মানগুলি কী?


40

লিনাক্সে নিম্নলিখিত প্রস্থান কোডগুলির সর্বনিম্ন এবং সর্বোচ্চ মানগুলি কী:

  1. প্রস্থান কোডটি বাইনারি এক্সিকিউটেবল (উদাহরণস্বরূপ: একটি সি প্রোগ্রাম) থেকে ফিরে আসে।
  2. প্রস্থান কোডটি কোনও ব্যাশ স্ক্রিপ্ট থেকে ফিরে আসে (কল করার সময় exit)।
  3. প্রস্থান কোডটি কোনও ফাংশন থেকে ফিরে আসে (কল করার সময় return)। আমি মনে করি এটি এর মধ্যে 0এবং 255

অংশ 3 এর জন্য, আপনি কি শেল ফাংশন থেকে ফিরে আসছেন ? এটি শেলের উপর নির্ভর করতে পারে, তবে আমি নোট করব যে বাশের ম্যানুয়ালটিতে " প্রস্থান স্থিতিগুলি 0 এবং 255 এর মধ্যে পড়ে " এবং " শেল বিল্টিনস এবং যৌগিক কমান্ডগুলি থেকে প্রস্থান স্থিতিগুলিও এই সীমার মধ্যে সীমাবদ্ধ " " returnঅবশ্যই, একটি শেল বিল্টিন is
টবি স্পিড 13

সম্পর্কিত (আপনার বেশিরভাগ প্রশ্নের উত্তর রয়েছে): প্রক্রিয়াটি শেষ হয়ে গেলে ডিফল্ট প্রস্থান কোড হয়?
স্টাফেন চেজেলাস 24'18

@ টবিস্পাইট, এটি bashশেলের একটি সীমাবদ্ধতা । অন্য কিছু শেল এর মতো zshযেকোন স্বাক্ষরিত 32 বিটের মান ফিরিয়ে দিতে পারে exit। কিছু তারা সমর্থন করে এমন যেকোন ধরণের ডেটা পছন্দ করতে rcবা esফিরিয়ে দিতে পারে (স্কেলার বা তালিকা)। তথ্যের জন্য লিঙ্কযুক্ত প্রশ্নোত্তর দেখুন।
স্টাফেন চেজেলাস 24'18

উত্তর:


74

সংখ্যা প্রেরণ _exit()/ exit_group()সিস্টেম কল (কখনও কখনও বলা প্রস্থান কোড সঙ্গে অস্পষ্টতা এড়াতে প্রস্থান অবস্থা যা পারেন প্রস্থান কোড বা সংকেত নম্বর এবং অতিরিক্ত তথ্য উপর নির্ভর করে একজন এনকোডিং উল্লেখ করা হয় প্রক্রিয়া নষ্ট হয়েছে বা স্বাভাবিকভাবে থেকে প্রস্থান ছিল কিনা ) প্রকারভেদে int, তাই লিনাক্সের মতো ইউনিক্সের মতো সিস্টেমগুলিতে, সাধারণত -2147483648 (-2 31 ) থেকে 2147483647 (2 31 -1) এর মান সহ 32 বীট পূর্ণসংখ্যা হয় ।

যাইহোক, সব সিস্টেমে, যখন পিতা বা মাতা প্রক্রিয়া (বা শিশু subreaper বা initযদি পিতা বা মাতা মারা যান) ব্যবহার করে wait(), waitpid(), wait3(), wait4()সিস্টেম কল এটি পুনরুদ্ধার করতে, শুধুমাত্র এটা নিচের 8 বিট উপলব্ধ (মান 0 255 (2 করছে 8 - 1))।

waitid()বেশিরভাগ সিস্টেমে (এবং সিএসসিএইচএলডি-তে সিগন্যাল হ্যান্ডলার) ব্যবহার করার সময় (এবং পসিক্স হিসাবে এখন স্ট্যান্ডার্ডের 2016 সংস্করণে আরও স্পষ্টভাবে প্রয়োজন ( _exit()স্পেসিফিকেশন দেখুন )), পুরো সংখ্যা উপলব্ধ ( si_statusফিরে আসা কাঠামোর ক্ষেত্রে) )। লিনাক্সে এখনও এটি waitid()ঘটেনি যদিও এটি API এর সাথে সংখ্যাটি 8 বিটে ছাড়ে, যদিও ভবিষ্যতে এটি পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে।

সাধারণত, আপনি কেবলমাত্র 0 টির (সাধারণত সাফল্যের অর্থ) 125 টির জন্য ব্যবহার করতে চান, কারণ অনেকগুলি শেলগুলি প্রস্থান হওয়ার স্থিতিটির$? উপস্থাপনে 128 এর উপরে মানগুলি ব্যবহার করা হয় এবং বিশেষত 126 এবং 127 প্রক্রিয়াটির সংকেত নম্বরটি এনকোড করতে ব্যবহার করে শর্ত।

exit()শেলটির জন্য যেমন করা হয় তেমন একই জিনিসটি বোঝাতে আপনি 126 থেকে 255 টি ব্যবহার করতে চাইতে পারেন $?(যেমন কোনও স্ক্রিপ্ট যখন করে ret=$?; ...; exit "$ret")। 0 -> 255 এর বাইরে মান ব্যবহার করা সাধারণত কার্যকর হয় না। আপনি কেবলমাত্র এমনটি করতেন যে আপনি যদি জানেন যে পিতামাতারা waitid()এমন সিস্টেমগুলিতে API ব্যবহার করবেন যা ছাঁটা হয় না এবং আপনার 32 বিট মানের প্রয়োজন হয়। নোট করুন যে আপনি exit(2048)উদাহরণস্বরূপ যদি কিছু করেন তবে এটি পিতামাতার দ্বারা success wait*()তিহ্যবাহী API গুলি ব্যবহার করে সাফল্য হিসাবে দেখা যাবে ।

আরও তথ্য এখানে:

এই প্রশ্নোত্তর আশা করা উচিত আপনার বেশিরভাগ অন্যান্য প্রশ্নের উত্তর দেওয়া উচিত এবং প্রস্থান স্থিতি বলতে কী বোঝানো হয়েছে তা পরিষ্কার করে দেওয়া উচিত । আমি আরও কয়েকটি জিনিস যুক্ত করব:

কোনও প্রক্রিয়া মারা না যাওয়া বা _exit()/ exit_group()সিস্টেম কলগুলিকে কল না করা পর্যন্ত এটি শেষ করতে পারে না । আপনার কাছ থেকে আসতে যখন main()মধ্যে C, libc কল ফেরত মান সঙ্গে সিস্টেম কল।

বেশিরভাগ ভাষায় একটি exit()ফাংশন থাকে যা সেই সিস্টেম কলটি আবৃত করে এবং তারা যে মানটি নেয় সেগুলি যদি সিস্টেম কলের মতো সাধারণত পাস করা হয়। (মনে রাখবেন যে এগুলি সাধারণত সি এর exit()ফাংশন দ্বারা পরিচ্ছন্নতার মতো আরও কাজ করে যা স্ট্ডিও বাফারগুলিকে ফ্লাশ করে, atexit()হুক চালায় ...)

এটি অন্তত:

$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234)                        = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234)                        = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234)                        = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)

আপনি মাঝে মাঝে এমন কয়েকজনকে দেখতে পান যে আপনি 0-255 এর বাইরে কোনও মান ব্যবহার করার সময় অভিযোগ করেন:

$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1)                           = ?

যখন আপনি একটি নেতিবাচক মান ব্যবহার করেন কিছু শেল অভিযোগ করে:

$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2)                           = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2)                           = ?

exitবিশেষ বিল্টিনে দেওয়া মান 0-> 255 এর বাইরে থাকলে পসিক্স আচরণটিকে অপরিজ্ঞাত করে দেয়।

কিছু শেল কিছু অপ্রত্যাশিত আচরণ দেখায় যদি আপনি তা করেন:

  • bash(এবং mkshতবে pdkshএটির ভিত্তিতে নয়) 8 টি বিটের মান কেটে নেওয়ার জন্য নিজেকে নিয়ে যায়:

    $ strace -e exit_group bash -c 'exit 1234'
    exit_group(210)                         = ?
    

    সুতরাং এই শেলগুলিতে, আপনি যদি 0-255 এর বাইরে কোনও মান দিয়ে প্রস্থান করতে চান তবে আপনাকে কিছু করতে হবে:

    exec zsh -c 'exit -- -12345'
    exec perl -e 'exit(-12345)'
    

    এটি একই প্রক্রিয়াতে আরেকটি কমান্ড কার্যকর করে যা আপনার পছন্দের মানের সাথে সিস্টেম কলকে কল করতে পারে।

  • যেমনটি অন্যান্য প্রশ্নোত্তরে উল্লিখিত হয়েছে, ksh93257 থেকে 256 + সর্বোচ্চ_সাইনাল_ নাম্বার পর্যন্ত প্রস্থান মূল্যগুলির জন্য সবচেয়ে অদ্ভুত আচরণ রয়েছে যেখানে কল করার পরিবর্তে exit_group()এটি নিজেকে সম্পর্কিত সংকেত দিয়ে হত্যা করে ¹

    $ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    zsh: suspended (signal)  ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    

    এবং অন্যথায় bash/ এর মতো সংখ্যা কেটে দেয় mksh


¹ যদিও এটি পরবর্তী সংস্করণে পরিবর্তিত হতে পারে। এটিটির উন্নয়নের বিষয়টি ksh93এটিএন্ডটিটির বাইরে একটি সম্প্রদায়ের প্রচেষ্টা হিসাবে গ্রহণ করা হয়েছে , পসিক্স দ্বারা কোনওরকম উত্সাহিত করা সত্ত্বেও , সেই আচরণটি ফিরিয়ে দেওয়া হচ্ছে


2
আপনি কি জানেন যে si_statusলিনাক্সের জন্য সম্পূর্ণ প্রস্থান কোডটি কার্যকর করতে কোনও আলোচনা আছে কিনা ?
Ruslan

2
@ রুসলান, অস্ট্রিংগ্রপবগসনাট / ভিউ.এফপি?id=594# c1318 (এরিক ব্লেক (রেডহ্যাট) থেকে) আমি যে লিঙ্কটি দিয়েছি তার চেয়ে বেশি নয়
স্টাফেন চেজেলাস

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

@ ভু, এই ক্ষুদ্র মাইক্রোকন্ট্রোলাররা লিনাক্স চালাতে পারে না। সি-এর intকমপক্ষে ১ b বিট হওয়া দরকার, তবে পসিক্স কম বেশি তার কমপক্ষে u২ বিট এবং প্রোগ্রামিং পরিবেশের একটি uint32_t থাকতে হবে । আমি জানি না যে লিনাক্স এমন কোনও প্রোগ্রামিং পরিবেশকে সমর্থন করে যেখানে ইনটগুলি 32 বিট ব্যতীত কিছুই না, আমি কখনই আসি নি।
স্টাফেন চ্যাজেলাস

1
কোনও পসিক্স কমপ্লায়েন্ট ওএস-তে আপনি বোর্ন শেলের সাম্প্রতিক সংস্করণে পুরো 32 বিট প্রস্থান কোডটি পেতে পারেন, দেখুন: schillix.sourceforge.net/man/man1/bosh.1.html
স্কিচলি

12

সর্বনিম্ন হয় 0এবং এটি সাফল্যের মান হিসাবে বিবেচিত হয়। অন্য সমস্ত ব্যর্থতা। সর্বাধিক 255হিসাবে হিসাবে পরিচিত -1

এই বিধিগুলি উভয় স্ক্রিপ্ট এবং অন্যান্য এক্সিকিউটেবলের পাশাপাশি শেল ফাংশনগুলির জন্য প্রযোজ্য।

বড় মানগুলি 256 এর মডুলোর ফলাফল to


2
সুনির্দিষ্টভাবে bashবলতে গেলে , কিছু বোর্নের মতো শেলগুলিতে (তবে না বা অন্যান্য সর্বাধিক ব্যবহৃত ব্যবহৃত) exitবিল্টিনে পাস করা প্রস্থান কোডটিকে মডুলো -256 হিসাবে বিবেচনা করা হয় না এবং পরিবর্তে একটি ত্রুটির কারণ হয়। (উদাহরণস্বরূপ, সাধারণটি বেশিরভাগ শেলের মধ্যে exit -1কোনও বহনযোগ্য সমতুল্য নয় exit 255)। এবং exit(-1)সি স্তরে সমান কিনা তা exit(255)বিশদে যা কাজ করা নির্দিষ্ট কিছু, তবে বাস্তবায়িত সংজ্ঞায়িত আচরণের উপর নির্ভর করে (যদিও এটি ব্যবহার করা সম্ভবত আপনি সম্ভবত ব্যবহার করতে পারেন এমন আধুনিক সিস্টেমে কোনও সমস্যা নয়)।
mtraceur

আমি যা জানি, কেবলমাত্র ksh93 exit(1)প্যারামিটারটিকে 8 বিটের মধ্যে সীমাবদ্ধ করে ।
স্কিচলি

6

এটি দেখতে খুব সহজ, তবে ওহ ওহ!

সি ভাষা (এবং প্রত্যক্ষ বা অপ্রত্যক্ষভাবে অন্যান্য বেশিরভাগ ভাষা অনুসরণ করে) এর জন্য প্রয়োজন যে প্রত্যাবর্তন মূল্যের সাথে একই আর্গুমেন্টের সাথে mainকল exitকরার সমান। এটি একটি পূর্ণসংখ্যা (রিটার্ন টাইপ সুস্পষ্টভাবে হয় int), তাই নীতিগতভাবে পরিসীমা হবে INT_MINথেকে INT_MAX

যাইহোক, পসিএক্স জানিয়েছে যে পাস করা কেবলমাত্র নিম্নতম 8 টি বিট exitঅপেক্ষার পিতামাতার প্রক্রিয়াতে উপলব্ধ করা হবে, আক্ষরিক অর্থে যেন এটি "স্থিতি & 0xFF"
সুতরাং, অনুশীলনে, প্রস্থান কোডটি একটি (এখনও স্বাক্ষরিত) পূর্ণসংখ্যা, যার মধ্যে সর্বনিম্ন 8 টি বিট সেট করা হয়।

সর্বনিম্ন এভাবে হবে -128 এবং সর্বোচ্চ 127 । থাকো, এটা সত্য নয়। এটি 0 থেকে 255 হবে।

তবে হায়, এটি এতটা সহজ হতে পারে না । অনুশীলনে, লিনাক্স (বা বরং বাশ) এটি আলাদাভাবে করে । রিটার্ন কোডগুলির বৈধ পরিসীমা 0 থেকে 255 (অর্থাত না স্বাক্ষরিত)।

বিভ্রান্তির এড়ানো পরিপ্রেক্ষিতে নিরাপদ পাশ হতে, এটি সম্ভবত একটি ভাল ধারণা মাত্র অনুমান যে ফিরতি কোড স্বাক্ষরবিহীন হয়, এবং ঢালাই কিছু আপনার কাছ থেকে ফিরে পেতে waitস্বাক্ষরবিহীন করতে। আপনি শেলের মধ্যে যা দেখেন তার সাথে এটি সামঞ্জস্যপূর্ণ। যেহেতু শীর্ষস্থানীয় বিটগুলি (সর্বাধিক উল্লেখযোগ্য একটি সহ) সাফ হয়ে গেছে, এটি এমনকি "ভুল" নয় কারণ প্রযুক্তিগতভাবে স্বাক্ষরিত হলেও প্রকৃত মানগুলি সর্বদা স্বাক্ষরযুক্ত থাকে (যেহেতু সাইন বিটটি সেট হয় না)।
এটি একটি প্রস্থান কোডের সাথে তুলনা করার সাধারণ ত্রুটি এড়াতেও সহায়তা করে -1, যা কোনও অদ্ভুত কারণে কোনও প্রোগ্রাম উপস্থিত না হয়েও কখনই উপস্থিত হবে বলে মনে হয় না -1(ভাল, অনুমান কেন!)!

আপনার শেষ পয়েন্ট সম্পর্কে, কোনও ফাংশন থেকে ফিরে, যদি এই ফাংশনটি ঘটে থাকে mainতবে উপরে দেখুন। অন্যথায়, এটি ফাংশনের রিটার্নের ধরন কী তার উপর নির্ভর করে, এটি নীতিগতভাবে কিছু হতে পারে (সহ void)।


আপনি waitid()পরিচয় করিয়ে দেওয়ার আগে 1989 এর ঠিক আগে ছিলেন ।
চৌকস

@ শাইলি: নিশ্চিত না আপনি কী বোঝাতে চেয়েছেন? waitid()কিছুটা ভিন্নভাবে ঠিক একই জিনিস করে। এটা একটা বিশেষ আইডি বা কোন থ্রেড জন্য অপেক্ষা, এবং এটি সরু-টু ফলাফল লিখেছেন siginfo_tগঠন যেখানে si_statusহয় int(তাই ... স্বাক্ষরিত , ঠিক একই)। তবুও, exit()কেবল সর্বনিম্ন 8 টি বিট পাস হয়, তাই ... হুডের নীচে একেবারে একই জিনিস।
দামন

exit()প্যারামিটারের সমস্ত 32 বিট কার্নেলের কাছে পাস waitid()করে প্রস্থান কোড থেকে সমস্ত 32 বিট প্রদান করে returns সম্ভবত আপনি লিনাক্সে পরীক্ষা করেছেন যেখানে কেউ বাগগুলি ঠিক করতে যত্ন করে না। আপনি যদি বিশ্বাস করেন না, এটি একটি পসিক্স সম্মতিজনক ওএসে পরীক্ষা করে দেখুন ...
সুন্দরভাবে

@schily: যদি তা সত্যি হয় (আমি মনে করি না এটা, কিন্তু যাহাই হউক না কেন), তারপর লিনাক্স করা হয় ভাঙ্গা । দয়া করে লিঙ্ক-টু-ইন-জবাবের পসিক্স স্পেসিফিকেশনটি পড়ুন exit, বিশেষত "বর্ননা" এর অধীনে দ্বিতীয় রেখায় বলা হয়েছে: "যদিও কেবলমাত্র অপেক্ষাকৃত গুরুত্বপূর্ণ 8 টি বিট (যা স্থিতি এবং 0377) অপেক্ষার প্যারেন্ট প্রসেসের জন্য উপলব্ধ থাকবে " । এটি একইভাবে কার্যকরভাবে কার্যকর হয় - 32 টি নয়, সর্বনিম্ন 8 টি বিট its
দামন

আমি ভেবেছিলাম আমি উল্লেখ করেছি যে লিনাক্সটি ভেঙে গেছে। আরও খারাপ: লিনাক্স কার্নেলের লোকেরা বাগগুলি ঠিক করতে অস্বীকার করেছেন। আপনি যদি পসিক্স স্ট্যান্ডার্ডটি পড়েন তবে আপনি দেখতে পাবেন যে ১৯৯৯ সালে SVr4 দ্বারা প্রবর্তিত 1995 সংস্করণ (SUSv1) সঠিকভাবে ব্যাখ্যা করেছে এবং মানকের সাম্প্রতিক সংস্করণগুলি (যেমন SUSv7tc2) এমনকি স্পষ্টভাবে ব্যাখ্যা করেছে waitid()এবং siginfo_tস্ট্রাক্টটি SIGCHLDহ্যান্ডলারের ফেরত পাঠিয়েছে exit()প্যারামিটার থেকে সমস্ত 32 বিট ।
দক্ষতার সাথে

2
  1. প্রস্থান কোডটি বাইনারি এক্সিকিউটেবল (উদাহরণস্বরূপ: একটি সি প্রোগ্রাম) থেকে ফিরে আসে।
  2. বাশ স্ক্রিপ্ট থেকে প্রস্থান কোডটি ফিরে আসবে (যখন প্রস্থানকে কল করবেন)।

যে কোনও প্রক্রিয়া থেকে কোডগুলি প্রস্থান করুন - এটি বাইনারি এক্সিকিউটেবল, শেল স্ক্রিপ্ট বা অন্য কিছু হোক না কেন - 0 থেকে 255 এর মধ্যে রয়েছে a এর থেকে আরও বড় মান পাস করা সম্ভব exit()তবে স্ট্যাটাসের কেবলমাত্র 8 টি বিট উপলব্ধ করা হয়েছে অন্যান্য প্রক্রিয়া মাধ্যমে wait()

  1. প্রস্থান কোডটি কোনও ফাংশন থেকে ফিরে আসবে (কলটি রিটার্ন করার সময়)। আমি মনে করি এটি 0 এবং 255 এর মধ্যে।

এসি ফাংশনটি প্রায় কোনও প্রকারের ফেরত হিসাবে ঘোষণা করা যেতে পারে। এর রিটার্ন মানটির সীমা পুরোপুরি সেই ধরণের দ্বারা নির্ধারিত হয়: উদাহরণস্বরূপ, কোনও ফাংশন প্রত্যাবর্তনের জন্য -128 থেকে 127 অথবা কোনও signed charফাংশন ফেরার জন্য 0 থেকে 4.2 বিলিয়ন unsigned int, অথবা কোনও ফ্লোটিং-পয়েন্ট নম্বর পর্যন্ত এবং infকোনও ফাংশন রিটার্নিং সহ অন্তর্ভুক্ত double। এবং এটি অ-সংখ্যাগত প্রকারগুলি গণনা করছে না, যেমন void *বা struct...

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