C লাইব্রেরি সেট করেনি errno
ঐতিহাসিক কারণে 0 1 । পসিক্স আর দাবি করে না যে এর লাইব্রেরিগুলি সাফল্যের ক্ষেত্রে মানকে পরিবর্তন করবে না এবং নতুন লিনাক্স ম্যান পৃষ্ঠাটি এটিerrno.h
প্রতিফলিত করে:
<errno.h>
হেডার ফাইলটি পূর্ণসংখ্যা পরিবর্তনশীল সংজ্ঞায়িত errno
, যা সিস্টেম কল ও একটি ত্রুটির ঘটনা মধ্যে কিছু লাইব্রেরি ফাংশন ইঙ্গিত কি ভুল হয়েছে দ্বারা সেট করা হয়। কলটির রিটার্ন মান কোনও ত্রুটি নির্দেশ করলেই এর মূল্য তাত্পর্যপূর্ণ (যেমন, -1
বেশিরভাগ সিস্টেম কল থেকে ; -1
বা NULL
বেশিরভাগ লাইব্রেরি ফাংশন থেকে); একটি ফাংশন যা সফল হয় তাকে পরিবর্তনের অনুমতি দেওয়া হয় errno
।
ANSI সি নীতি বলে যে, কমিটি অনুভূত এটা গ্রহণ করেন এবং ব্যবহারের বিদ্যমান অনুশীলনের প্রমিত আরো ব্যবহারিক ছিল errno
।
সেটিংটি কেন্দ্রিক ত্রুটি প্রতিবেদন করার যন্ত্রটি errno
সাধারণত সর্বোত্তমভাবে সহনশীলতার সাথে বিবেচিত হয়। এটি লাইব্রেরির ক্রিয়াকলাপগুলির মধ্যে একটি a `প্যাথলজিকাল কাপলিং '' প্রয়োজন এবং একটি স্ট্যাটিক লিখনযোগ্য মেমরি সেল ব্যবহার করে, যা ভাগযোগ্য লাইব্রেরিগুলি নির্মাণে হস্তক্ষেপ করে। তবুও, কমিটি আরও উচ্চাকাঙ্ক্ষী কিছু আবিষ্কার করার পরিবর্তে এই বিদ্যমান, তবে স্বল্পতা, যন্ত্রপাতিটিকে মানিক করে তোলা পছন্দ করে।
errno
সেট হয়ে গেছে কিনা তা যাচাই করার বাইরে প্রায় সর্বদা ত্রুটির জন্য চেক করার একটি উপায় রয়েছে । যদি চেক করা হচ্ছে errno
পেয়েছিলাম সেট সবসময় নির্ভরযোগ্য নয়, যেহেতু কিছু কল ত্রুটি কারণ পেতে একটি পৃথক এপিআই কলিং প্রয়োজন। উদাহরণস্বরূপ, ferror()
যদি আপনি fread()
বা থেকে একটি সংক্ষিপ্ত ফলাফল পান তবে একটি ত্রুটি পরীক্ষা করার জন্য ব্যবহৃত হয় fwrite()
।
যথেষ্ট উত্সাহের ব্যাপার হল ব্যবহার আপনার উদাহরণ strtod()
ক্ষেত্রে এক সেটিং কোথায় errno
0 সামনে কল প্রয়োজনীয় সঠিকভাবে সনাক্ত করতে যদি কোনো ত্রুটি ঘটেছে। সমস্ত 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
সর্বদা নিজেকে শূন্যে সেট করতে পারেন।