C লাইব্রেরি সেট করেনি errnoঐতিহাসিক কারণে 0 1 । পসিক্স আর দাবি করে না যে এর লাইব্রেরিগুলি সাফল্যের ক্ষেত্রে মানকে পরিবর্তন করবে না এবং নতুন লিনাক্স ম্যান পৃষ্ঠাটি এটিerrno.h প্রতিফলিত করে:
<errno.h>হেডার ফাইলটি পূর্ণসংখ্যা পরিবর্তনশীল সংজ্ঞায়িত errno, যা সিস্টেম কল ও একটি ত্রুটির ঘটনা মধ্যে কিছু লাইব্রেরি ফাংশন ইঙ্গিত কি ভুল হয়েছে দ্বারা সেট করা হয়। কলটির রিটার্ন মান কোনও ত্রুটি নির্দেশ করলেই এর মূল্য তাত্পর্যপূর্ণ (যেমন, -1বেশিরভাগ সিস্টেম কল থেকে ; -1বা NULLবেশিরভাগ লাইব্রেরি ফাংশন থেকে); একটি ফাংশন যা সফল হয় তাকে পরিবর্তনের অনুমতি দেওয়া হয় errno।
ANSI সি নীতি বলে যে, কমিটি অনুভূত এটা গ্রহণ করেন এবং ব্যবহারের বিদ্যমান অনুশীলনের প্রমিত আরো ব্যবহারিক ছিল errno।
সেটিংটি কেন্দ্রিক ত্রুটি প্রতিবেদন করার যন্ত্রটি errnoসাধারণত সর্বোত্তমভাবে সহনশীলতার সাথে বিবেচিত হয়। এটি লাইব্রেরির ক্রিয়াকলাপগুলির মধ্যে একটি a `প্যাথলজিকাল কাপলিং '' প্রয়োজন এবং একটি স্ট্যাটিক লিখনযোগ্য মেমরি সেল ব্যবহার করে, যা ভাগযোগ্য লাইব্রেরিগুলি নির্মাণে হস্তক্ষেপ করে। তবুও, কমিটি আরও উচ্চাকাঙ্ক্ষী কিছু আবিষ্কার করার পরিবর্তে এই বিদ্যমান, তবে স্বল্পতা, যন্ত্রপাতিটিকে মানিক করে তোলা পছন্দ করে।
errnoসেট হয়ে গেছে কিনা তা যাচাই করার বাইরে প্রায় সর্বদা ত্রুটির জন্য চেক করার একটি উপায় রয়েছে । যদি চেক করা হচ্ছে errnoপেয়েছিলাম সেট সবসময় নির্ভরযোগ্য নয়, যেহেতু কিছু কল ত্রুটি কারণ পেতে একটি পৃথক এপিআই কলিং প্রয়োজন। উদাহরণস্বরূপ, ferror()যদি আপনি fread()বা থেকে একটি সংক্ষিপ্ত ফলাফল পান তবে একটি ত্রুটি পরীক্ষা করার জন্য ব্যবহৃত হয় fwrite()।
যথেষ্ট উত্সাহের ব্যাপার হল ব্যবহার আপনার উদাহরণ strtod()ক্ষেত্রে এক সেটিং কোথায় errno0 সামনে কল প্রয়োজনীয় সঠিকভাবে সনাক্ত করতে যদি কোনো ত্রুটি ঘটেছে। সমস্ত strto*()স্ট্রিং টু নং ফাংশনের এই প্রয়োজনীয়তা রয়েছে কারণ বৈধ ফেরতের মান এমনকি ত্রুটির পরেও ফিরে আসে is
errno = 0;
char *endptr;
double x = strtod(str1, &endptr);
if (endptr == str1) {
/*...parse error */
} else if (errno == ERANGE) {
if (x == 0) {
/*...underflow */
} else if (x == HUGE_VAL) {
/*...positive overflow */
} else if (x == -HUGE_VAL) {
/*...negative overflow */
} else {
/*...unknown range error? */
}
}
উপরের কোডটি strtod()লিনাক্সে দলিল হিসাবে ব্যবহারের উপর ভিত্তি করে । সি স্ট্যান্ডার্ডটি কেবল এই শর্ত দেয় যে আন্ডারফ্লো সবচেয়ে ক্ষুদ্র ধনাত্মকটির চেয়ে বেশি কোনও মান প্রদান করতে পারে না double, এবং errnoসেটাকে 2 টিERANGE নির্ধারিত বাস্তবায়ন হিসাবে সেট করা হয় কিনা ।
প্রকৃতপক্ষে একটি বিস্তৃত সার্টের পরামর্শমূলক লিখন-আপ রয়েছে যা errnoএকটি লাইব্রেরি কল করার আগে সর্বদা 0 তে সেট করার পরামর্শ দেয় এবং কলটির পরে এর মান পরীক্ষা করে ব্যর্থতা দেখা দেয় । কারণ errnoকলটি 3 টি সফল হলেও কিছু লাইব্রেরি কল সেট করবে ।
errnoপ্রোগ্রামের শুরুতে এর মান 0 হয় তবে এটি কোনও লাইব্রেরির ক্রিয়াকলাপ দ্বারা কখনই 0 এ সেট হয় না। মানটি errnoকোনও গ্রন্থাগার ফাংশন কল দ্বারা নোনজারোতে সেট করা যেতে পারে যেখানে ত্রুটি আছে কি না, তবে শর্ত থাকে যে এর ব্যবহারটি errnoসি স্ট্যান্ডার্ডে ফাংশনের বর্ণনায় নথিবদ্ধ না হয়। কোনও প্রোগ্রামের জন্য errnoত্রুটি প্রতিবেদন করার পরে কেবলমাত্র তার বিষয়বস্তুগুলি পরিদর্শন করা অর্থবহ । আরও স্পষ্টভাবে, errnoতাত্ক্ষণিকভাবে সেট errnoকরে এমন একটি লাইব্রেরি ফাংশন ত্রুটি কোড ফেরত দেওয়ার পরে কেবল অর্থবহ ।
১. পূর্বে আমি দাবি করেছি যে এটি পূর্ববর্তী কল থেকে কোনও ত্রুটিটি মাস্কিং এড়ানোর জন্য। এই দাবিটি সমর্থন করার জন্য আমি কোনও প্রমাণ পাই না। আমারও বোগাসের printf()উদাহরণ ছিল।
২. এটি নির্দেশ করার জন্য @ চাক্সকে ধন্যবাদ। রেফারেন্সটি C.11 §7.22.1.3 ¶10।
৩.কীথথম্পসন একটি মন্তব্যে প্রেরিত।
errnoসর্বদা নিজেকে শূন্যে সেট করতে পারেন।