Man পৃষ্ঠা পড়া এবং কিছু কোড সত্যিই মধ্যে পার্থক্য বুঝতে আমাকে সাহায্য করেছিল না - বা ভাল, আমি ব্যবহার করা উচিত - perror("...")
বা fprintf(stderr, "...")
।
Man পৃষ্ঠা পড়া এবং কিছু কোড সত্যিই মধ্যে পার্থক্য বুঝতে আমাকে সাহায্য করেছিল না - বা ভাল, আমি ব্যবহার করা উচিত - perror("...")
বা fprintf(stderr, "...")
।
উত্তর:
কলিং perror
আপনাকে এর ব্যাখ্যা করা মান দেবে errno
, যা একটি থ্রেড-লোকাল ত্রুটি মান যা পসইএক্সএক্স সিস্কলগুলি লিখেছিল (যেমন, প্রতিটি থ্রেডের নিজস্ব মূল্য আছে errno
)। উদাহরণস্বরূপ, যদি আপনি কল করে থাকেন open()
এবং কোনও ত্রুটি উত্পন্ন হয়েছে (যেমন, এটি ফিরে এসেছে -1
), তবে আপনি perror
প্রকৃত ত্রুটিটি কী তা দেখার জন্য তত্ক্ষণাত কল করতে পারবেন। মনে রাখবেন যে আপনি যদি ইতিমধ্যে অন্য সিস্টেমে কল করেন তবে তার মানটি errno
লিখে দেওয়া perror
হবে এবং যদি পূর্ববর্তী সিস্কলে কোনও ত্রুটি উত্পন্ন হয় তবে কলিংটি আপনার সমস্যাটি সনাক্তকরণে কোনও কাজে আসবে না।
fprintf(stderr, ...)
অন্যদিকে আপনার নিজস্ব কাস্টম ত্রুটি বার্তা মুদ্রণ করতে ব্যবহার করা যেতে পারে। প্রিন্ট করে stderr
আপনি নিজের ত্রুটির প্রতিবেদন আউটপুটটিকে "স্বাভাবিক" আউটপুট মিশ্রিত করা উচিত যা এড়ানো উচিত stdout
।
মনে রাখতে fprintf(stderr, "%s\n", strerror(errno))
হবে perror(NULL)
যেহেতু একটি কল এর জন্য strerror(errno)
মুদ্রিত স্ট্রিংয়ের মান উত্পন্ন করবে errno
এবং আপনি তার মাধ্যমে অন্য কোনও কাস্টম ত্রুটি বার্তার সাথে এটি সংযুক্ত করতে পারেন fprintf
।
strerror
থ্রেড-নিরাপদ করা প্রয়োজন হয় না। এটি বোকা, তবে এটি স্ট্যান্ডার্ড। strerror_l
এর পরিবর্তে POSIX 2008 সিস্টেমে ড্রপ-ইন প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে। strerror_r
পুরানো সিস্টেমে এগুলি উপলভ্য তবে এর কিছু সিস্টেমের ননকনফর্মেন্ট সংস্করণ থাকার সাথে সত্যই বাজে সমস্যা রয়েছে।
perror
যোগ '\n'
শেষে তাই বিন্যাস হবে "%s\n"
, তাই না?
strerror_s
আসলে ইন্টারফেসের মতো খুব খারাপ নয়।
_s
স্ট্যান্ডার্ডের মধ্যে তাদের জাঙ্কটি পাওয়া মূলত এমএসের একটি গেম ছিল ("আপনি যদি আমাদের ইন্টারফেস গ্রহণ করেন, আমরা আসলে আমাদের পণ্যগুলিকে আপনার মানকে সমর্থন করার বিষয়টি বিবেচনা করব।") এবং অবশ্যই তারা এখন অনুসরণ করছে না। আসলে আমি একমত যে এই একটি ইন্টারফেস নিজের মধ্যে খারাপ নয় bad খারাপটি হ'ল প্রচারণা (সংকলক সতর্কতার আকারে) যে স্ট্যান্ডার্ড লাইব্রেরির বেশিরভাগটি "অনিরাপদ" এবং _s
ফাংশনগুলির পুরো পরিবারকে স্ট্যান্ডার্ডগুলির পরিবর্তে ব্যবহার করা উচিত।
তারা বরং বিভিন্ন জিনিস না।
এর সাথে সম্পর্কিত perror()
কোনও বার্তা মুদ্রণ করতে আপনি ব্যবহার stderr
করেন errno
। আপনি এই ব্যবহার fprintf()
প্রিন্ট করতে কিছু করার stderr
, বা অন্য কোন স্ট্রীম। perror()
একটি খুব বিশেষ মুদ্রণ ফাংশন:
perror(str);
সমতুল্য
if (str)
fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
fprintf(stderr, "%s\n", strerror(errno));
perror(const char *s)
: আপনার দেওয়া স্ট্রিংটি মুদ্রণ করে একটি স্ট্রিং যা বর্তমান মানটিকে বর্ণনা করে errno
।
stderr
: এটি আপনার নিজস্ব ত্রুটি বার্তাগুলিতে পাইপ দিতে একটি আউটপুট স্ট্রিম ব্যবহৃত হয় (টার্মিনালের ডিফল্ট)।
প্রাসঙ্গিক:
char *strerror(int errnum)
: এটিকে একটি ত্রুটি নম্বর দিন এবং এটি সম্পর্কিত ত্রুটিযুক্ত স্ট্রিংটি ফিরিয়ে দেবে।
perror () সর্বদা stderr এ লিখেন; স্ট্রেরার (), এফপ্রিন্টফ () এর সাথে একত্রে ব্যবহৃত, যে কোনও আউটপুটে লিখতে পারে - স্টারডার সহ তবে একচেটিয়াভাবে নয়।
fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
তদ্ব্যতীত, পেরার তার নিজস্ব পাঠ্যটি "পাঠ্য: ত্রুটির বিবরণ" গঠনের জন্য চাপিয়ে দেয়
পেরের ফাংশনটি কার্যকর করার জন্য কল প্রয়োগ করতে আরও বেশি সময় নেয় ব্যবহারকারী স্থান থেকে কর্নাল স্পেসে চলে যায় এফপ্রিন্টফ কলগুলি গোপাল থেকে এপি থেকে কার্নালের দিকে
If you use a function that effects errno then it makes sense to use perror
.যদি আপনি এমন কোনও ফাংশন ব্যবহার করেন যা এর্নোকে প্রভাবিত করে না এবং কেবল একটি ত্রুটি কোড দেয় যা আপনার এফপ্রিন্টফ ব্যবহার করতে হবে (স্ট্ডার, এফএমটি, ...)। উদাহরণস্বরূপ, স্ট্রিংল লং_ম্যাক্স বা লং_মিন ফিরিয়ে দেবে যদি কোনও স্ট্রিং সীমার বাইরে থাকে এবং ইরানকে ভুল সেট করে। সুতরাং যদি স্ট্রটল সীমার বাইরে থাকার কারণে ব্যর্থ হয় তবে আমি ভীতি ব্যবহার করব।