কখন আমি পেরার ("…") এবং এফপ্রিন্টফ (স্টাডার, "...") ব্যবহার করব?


105

Man পৃষ্ঠা পড়া এবং কিছু কোড সত্যিই মধ্যে পার্থক্য বুঝতে আমাকে সাহায্য করেছিল না - বা ভাল, আমি ব্যবহার করা উচিত - perror("...")বা fprintf(stderr, "...")

উত্তর:


113

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

fprintf(stderr, ...)অন্যদিকে আপনার নিজস্ব কাস্টম ত্রুটি বার্তা মুদ্রণ করতে ব্যবহার করা যেতে পারে। প্রিন্ট করে stderrআপনি নিজের ত্রুটির প্রতিবেদন আউটপুটটিকে "স্বাভাবিক" আউটপুট মিশ্রিত করা উচিত যা এড়ানো উচিত stdout

মনে রাখতে fprintf(stderr, "%s\n", strerror(errno))হবে perror(NULL)যেহেতু একটি কল এর জন্য strerror(errno)মুদ্রিত স্ট্রিংয়ের মান উত্পন্ন করবে errnoএবং আপনি তার মাধ্যমে অন্য কোনও কাস্টম ত্রুটি বার্তার সাথে এটি সংযুক্ত করতে পারেন fprintf


3
ওহ, এটি পেয়েছে perআরনের মানের উপর নির্ভর করে পেরার ফাংশনটি ভিন্নভাবে কাজ করে। If you use a function that effects errno then it makes sense to use perror.যদি আপনি এমন কোনও ফাংশন ব্যবহার করেন যা এর্নোকে প্রভাবিত করে না এবং কেবল একটি ত্রুটি কোড দেয় যা আপনার এফপ্রিন্টফ ব্যবহার করতে হবে (স্ট্ডার, এফএমটি, ...)। উদাহরণস্বরূপ, স্ট্রিংল লং_ম্যাক্স বা লং_মিন ফিরিয়ে দেবে যদি কোনও স্ট্রিং সীমার বাইরে থাকে এবং ইরানকে ভুল সেট করে। সুতরাং যদি স্ট্রটল সীমার বাইরে থাকার কারণে ব্যর্থ হয় তবে আমি ভীতি ব্যবহার করব।
freeboy1015

6
একটি বিশদ, strerrorথ্রেড-নিরাপদ করা প্রয়োজন হয় না। এটি বোকা, তবে এটি স্ট্যান্ডার্ড। strerror_lএর পরিবর্তে POSIX 2008 সিস্টেমে ড্রপ-ইন প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে। strerror_rপুরানো সিস্টেমে এগুলি উপলভ্য তবে এর কিছু সিস্টেমের ননকনফর্মেন্ট সংস্করণ থাকার সাথে সত্যই বাজে সমস্যা রয়েছে।
আর .. গিথহাব বন্ধ করুন ICE

একটি nitpick যেমন, আমি মনে করি perrorযোগ '\n'শেষে তাই বিন্যাস হবে "%s\n", তাই না?
জেনস গুষ্ট্ট

1
@ আর .., হা, আমার কাছে ইতিমধ্যে আছে এবং আমি যতদূর জানি তারা আমাকে কিছু দিচ্ছে না। এবং যেহেতু এমএস পুরোপুরি সি এর জন্য তাদের সমর্থনকে কাটাচ্ছে বলে মনে হচ্ছে, শেষে আমি একমাত্র হব :) strerror_sআসলে ইন্টারফেসের মতো খুব খারাপ নয়।
জেনস গুস্ট্ট

2
পুরোপুরি সমর্থন কাটা? দেখে মনে হচ্ছে তারা আবার কমিটি বোকা বানিয়েছে। _sস্ট্যান্ডার্ডের মধ্যে তাদের জাঙ্কটি পাওয়া মূলত এমএসের একটি গেম ছিল ("আপনি যদি আমাদের ইন্টারফেস গ্রহণ করেন, আমরা আসলে আমাদের পণ্যগুলিকে আপনার মানকে সমর্থন করার বিষয়টি বিবেচনা করব।") এবং অবশ্যই তারা এখন অনুসরণ করছে না। আসলে আমি একমত যে এই একটি ইন্টারফেস নিজের মধ্যে খারাপ নয় bad খারাপটি হ'ল প্রচারণা (সংকলক সতর্কতার আকারে) যে স্ট্যান্ডার্ড লাইব্রেরির বেশিরভাগটি "অনিরাপদ" এবং _sফাংশনগুলির পুরো পরিবারকে স্ট্যান্ডার্ডগুলির পরিবর্তে ব্যবহার করা উচিত।
আর .. গিথহাব বন্ধ করুন ICE

40

তারা বরং বিভিন্ন জিনিস না।

এর সাথে সম্পর্কিত 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));

12

perror(const char *s): আপনার দেওয়া স্ট্রিংটি মুদ্রণ করে একটি স্ট্রিং যা বর্তমান মানটিকে বর্ণনা করে errno

stderr: এটি আপনার নিজস্ব ত্রুটি বার্তাগুলিতে পাইপ দিতে একটি আউটপুট স্ট্রিম ব্যবহৃত হয় (টার্মিনালের ডিফল্ট)।

প্রাসঙ্গিক:

char *strerror(int errnum): এটিকে একটি ত্রুটি নম্বর দিন এবং এটি সম্পর্কিত ত্রুটিযুক্ত স্ট্রিংটি ফিরিয়ে দেবে।


2

perror () সর্বদা stderr এ লিখেন; স্ট্রেরার (), এফপ্রিন্টফ () এর সাথে একত্রে ব্যবহৃত, যে কোনও আউটপুটে লিখতে পারে - স্টারডার সহ তবে একচেটিয়াভাবে নয়।

fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")

তদ্ব্যতীত, পেরার তার নিজস্ব পাঠ্যটি "পাঠ্য: ত্রুটির বিবরণ" গঠনের জন্য চাপিয়ে দেয়


-2

পেরের ফাংশনটি কার্যকর করার জন্য কল প্রয়োগ করতে আরও বেশি সময় নেয় ব্যবহারকারী স্থান থেকে কর্নাল স্পেসে চলে যায় এফপ্রিন্টফ কলগুলি গোপাল থেকে এপি থেকে কার্নালের দিকে

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