সি এবং সি ++ এ, exit()এবং এর মধ্যে পার্থক্য কী abort()? আমি একটি ত্রুটির পরে আমার প্রোগ্রামটি শেষ করার চেষ্টা করছি (ব্যতিক্রম নয়)।
সি এবং সি ++ এ, exit()এবং এর মধ্যে পার্থক্য কী abort()? আমি একটি ত্রুটির পরে আমার প্রোগ্রামটি শেষ করার চেষ্টা করছি (ব্যতিক্রম নয়)।
উত্তর:
abort()atexit()প্রথমটি ব্যবহার করে নিবন্ধিত ফাংশনগুলি কল না করে এবং প্রথমে অবজেক্টের ডেস্ট্রাক্টরকে কল না করেই আপনার প্রোগ্রামটি প্রস্থান করে । exit()আপনার প্রোগ্রামটি প্রস্থান করার আগে উভয়ই করে। এটি যদিও স্বয়ংক্রিয় বস্তুর জন্য ডেস্ট্রাক্টরদের কল করে না। সুতরাং
A a;
void test() {
static A b;
A c;
exit(0);
}
ধ্বংস aএবং bসঠিকভাবে করবে, কিন্তু এর ডেস্ট্রাক্টরদের কল করবে না c। abort()না অবজেক্টের ডেস্ট্রাক্টরকে কল করবে না। যেহেতু এটি দুর্ভাগ্যজনক, সি ++ স্ট্যান্ডার্ড একটি বিকল্প পদ্ধতি বর্ণনা করে যা সঠিকভাবে সমাপ্তি নিশ্চিত করে:
স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ অবজেক্টগুলি সমস্ত
main()এমন প্রোগ্রামে ধ্বংস হয়ে যায় যার ফাংশনে কোনও স্বয়ংক্রিয় অবজেক্ট থাকে না এবং কলটি কার্যকর করেexit()। নিয়ন্ত্রণmain()ধরা পড়ে এমন একটি ব্যতিক্রম ছুঁড়ে ফেলে সরাসরি এগুলিতে স্থানান্তর করা যায়main()।
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
কল exit()করার throw exit_exception(exit_code);পরিবর্তে পরিবর্তে সেই কোডটি সাজান ।
অ্যাবার্ট একটি SIGABRT সিগন্যাল প্রেরণ করে, প্রস্থানটি কেবল সাধারণ ক্লিনআপ সম্পাদন করে অ্যাপ্লিকেশনটি বন্ধ করে দেয়।
আপনি চাইলে আপনি কোনও অ্যাওর্ট সিগন্যাল পরিচালনা করতে পারেন, তবে ডিফল্ট আচরণটি ত্রুটি কোডের সাথে অ্যাপ্লিকেশনটি বন্ধ করা।
গর্ভপাত আপনার স্থিতিশীল এবং গ্লোবাল সদস্যদের অবজেক্ট ধ্বংস করতে পারে না, তবে প্রস্থান হবে।
অবশ্যই অ্যাপ্লিকেশন পুরোপুরি বন্ধ হয়ে গেলে অপারেটিং সিস্টেম যেকোন অদৃশ্য মেমরি এবং অন্যান্য সংস্থানকে মুক্ত করবে।
উভয়ই গর্ভপাত এবং প্রস্থান প্রোগ্রাম সমাপ্তিতে (ধরে নিলে আপনি ডিফল্ট আচরণকে ওভাররাইড করেননি), রিটার্ন কোডটি আপনার অ্যাপ্লিকেশন শুরু হওয়া পিতামাতার প্রক্রিয়াতে ফিরে আসবে।
নিম্নলিখিত উদাহরণটি দেখুন:
SomeClassType someobject;
void myProgramIsTerminating1(void)
{
cout<<"exit function 1"<<endl;
}
void myProgramIsTerminating2(void)
{
cout<<"exit function 2"<<endl;
}
int main(int argc, char**argv)
{
atexit (myProgramIsTerminating1);
atexit (myProgramIsTerminating2);
//abort();
return 0;
}
মন্তব্যসমূহ:
তাহলে পরিত্যাগ uncommented হল: কিছুই ছাপা হয় এবং someobject এর বিনাশকারী নামক করা হবে না।
তাহলে পরিত্যাগ উপরে মত মন্তব্য করা হয়: someobject বিনাশকারী বলা হবে আপনি নিম্নলিখিত আউটপুট পাবেন:
প্রস্থান প্রস্থান 2
প্রস্থান ফাংশন 1
যখন কোনও প্রোগ্রাম কল exit() কল করে তখন নিম্নলিখিত বিষয়গুলি ঘটে :
atexitফাংশনগুলি কার্যকর করা হয়tmpfileসরানো হবেabort() ফাংশন পাঠায় SIGABRTএটা ধরা না হয় প্রোগ্রাম কোন গ্যারান্টি খোলা স্ট্রিম রাঙা / বন্ধ করা হয় বা মাধ্যমে তৈরি করা অস্থায়ী ফাইল দিয়ে শেষ করা হয়, বর্তমান প্রক্রিয়ায় সংকেত tmpfileসরিয়ে ফেলা হয়, atexitনিবন্ধিত ফাংশন বলা হয় না হয়, এবং একটি অ হোস্টটিতে শূন্য প্রস্থান স্থিতি ফিরে আসে।
প্রস্থান () ম্যানুয়াল পৃষ্ঠা থেকে:
প্রস্থান () ফাংশনটি স্বাভাবিক প্রক্রিয়াটি সমাপ্ত করে এবং স্থিতির মান & 0377 প্যারেন্টে ফিরে আসে।
গর্ভপাত () ম্যানুয়াল পৃষ্ঠা থেকে:
গর্ভপাত () প্রথমে SIGABRT সিগন্যালটিকে অবরোধ মুক্ত করে এবং তারপরে কলিং প্রক্রিয়াটির জন্য সেই সংকেত উত্থাপন করে। SIGABRT সিগন্যাল ধরা না পড়লে এবং সিগন্যাল হ্যান্ডলারটি ফিরে না আসলে প্রক্রিয়াটির অস্বাভাবিক সমাপ্তির ফলস্বরূপ।
abortSIGABRTসংকেত প্রেরণ করে abortকলারে ফিরে আসে না। SIGABRTসিগন্যালের জন্য ডিফল্ট হ্যান্ডলার অ্যাপ্লিকেশনটি বন্ধ করে দেয়। stdioফাইল স্ট্রিমগুলি ফ্লাশ করা হয়, তারপরে বন্ধ করা হয়। সি ++ শ্রেণীর দৃষ্টান্তগুলির জন্য ডেস্ট্রাক্টরগুলি অবশ্য নয় (এটির বিষয়ে নিশ্চিত নন - সম্ভবত ফলাফলগুলি অপরিশোধিত?)।
exitএর নিজস্ব কলব্যাক রয়েছে, সেট করা আছে atexit। যদি কলব্যাকগুলি নির্দিষ্ট করা হয় (বা কেবল একটি), তাদের নিবন্ধের আদেশের বিপরীতে (স্ট্যাকের মতো) বলা হয়, তবে প্রোগ্রামটি প্রস্থান করে। যেমনটি abort, exitকলারে ফিরে আসে না। stdioফাইল স্ট্রিমগুলি ফ্লাশ করা হয়, তারপরে বন্ধ করা হয়। এছাড়াও, সি ++ শ্রেণীর উদাহরণগুলির জন্য ডেস্ট্রাক্টরদের ডাকা হয়।