একটি সেগফল্টিং প্রোগ্রাম থেকে পাইপিং আউটপুট


13

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা একটি প্রোগ্রামকে কল করে (বিশেষত, ttf2afmটেলেক্সের 3.0 এর অংশ) যা কখনও কখনও সিগফাল্ট হয় এবং কখনও কখনও হয় না। আমার প্রয়োজনীয় তথ্যগুলি সেগফোল্টসের আগে সর্বদা মুদ্রিত হয় তবে প্রোগ্রামটি ব্যর্থ হওয়ার পরে পাইপ পুনর্নির্দেশটি ব্যর্থ হতে বাধা দিতে এবং পাইপটিতে কোনও আউটপুট না দেওয়ার জন্য আমার বেশ কষ্ট হচ্ছে।

আমি একটি হিসাবে FIFO মাধ্যমে পুনঃনির্দেশ চেষ্টা করেছি, একটি প্রক্রিয়া parenthesizing trueশেষে একটি শেল ফাংশন থেকে নির্বাহ এবং encasing sh -cকরলেও স্ক্রিপ্ট কখনো যাক প্রক্রিয়া আউটপুট বলে মনে হয় কিছু , আপনাকে পুনঃনির্দেশিত বা এমনকি stderr হবে অন্যথায় নয়।

আমি জানি যে এটি আউটপুট সক্ষম, কারণ এটি কমান্ড-লাইন থেকে এটি দিতে পুরোপুরি সক্ষম, তবে কোনও কারণে স্ক্রিপ্ট থেকে নয়।

আমার প্রশ্ন হ'ল, প্রোগ্রামটি সেগফাল্ট করে যে কোনও উপায়ে আমাকে আউটপুট দেয় এই বিষয়টি উপেক্ষা করার জন্য স্ক্রিপ্টের কোনও উপায় আছে?

আমি বেস 4.1.10 (2) চালাচ্ছি - দয়া করে।

উত্তর:


12

প্রোগ্রামগুলি দক্ষতার জন্য সাধারণত তাদের আউটপুট বাফার করে। এটি হ'ল এগুলি মেমরির অঞ্চলে আউটপুট জমে থাকে (বাফার নামে পরিচিত) এবং তারা আসলে আউটপুটটি কেবল তখনই পায় যখন বাফার পূর্ণ হয় বা প্রোগ্রামের কয়েকটি মূল পয়েন্ট থাকে। প্রোগ্রামটি সাধারণত শেষ হয়ে গেলে, এটি আউটপুট বাফারটিকে ফ্লাশ করে (যেমন এতে থাকা কোনও ডেটা মুদ্রণ করে)। এটি segfaults যখন, বাফার সামগ্রী হারিয়ে যায়।

প্রোগ্রামটি সরাসরি টার্মিনালে চলাকালীন আপনি এই প্রভাবটি লক্ষ্য করেন না কারণ প্রোগ্রামটির আউটপুট টার্মিনালের সাথে সংযুক্ত থাকলে (নিয়মিত ফাইল বা পাইপের বিপরীতে) আচরণটি আলাদা হয়। একটি টার্মিনালে, ডিফল্ট আচরণটি প্রতিটি লাইনের শেষে বাফারটিকে ফ্লাশ করা হয়। অতএব আপনি প্রতিটি সম্পূর্ণ লাইন দেখতে পাবেন যা পয়েন্ট অবধি উত্পাদিত হয় যখন প্রোগ্রামটি সিগফল্ট হয়।

আপনি প্রোগ্রামটিকে একটি টার্মিনালে চালিত করতে এবং এর আউটপুট সংগ্রহ করতে বাধ্য করতে পারেন। সহজ উপায় চালানো হয় script। বেশ কয়েকটি বিরক্তি রয়েছে যা আপনার চারপাশে কাজ করার প্রয়োজন:

  • script ট্রান্সক্রিপ্ট ফাইলটিতে একটি শিরোনাম লাইন যুক্ত করে, যা আপনাকে পরে সরিয়ে ফেলতে হবে।
  • script কমান্ডের স্থিতি কোডটি ফিরিয়ে দেয় না, তাই যদি আপনি সেগফল্ট বা অন্য কোনও ত্রুটি সম্পর্কে জানতে চান তবে আপনাকে এটি অন্য কোথাও সংরক্ষণ করতে হবে।
  • scriptস্বাভাবিক আউটপুট এবং ত্রুটি ঘটায়; আপনি ত্রুটি আউটপুট একটি পৃথক ফাইলে সংরক্ষণ করতে চান।
export FONT="foo"
script -q -c '
    ttf2afm "$FONT.ttf" 2>"$FONT.ttf2afm-err";
    echo $? >"$FONT.ttf2afm-status"
' "$FONT.ttf2afm-typescript"
tail -n +2 <"$FONT.ttf2afm-typescript" >"foo.afm"
rm "$FONT.ttf2afm-typescript"
if [ "$(cat "$FONT.ttf2afm-status")" -ne 0 ]; then
  echo 1>&2 "Warning: ttf2afm failed"
  cat "$FONT.ttf2afm-err"
fi

কিছু শেল সেটিংয়ের মতো আউটপুট বাফারকে 0 বা অন্য কোনওটিতে সেট করবে এর মতো আরও মার্জিত সমাধান নেই?
অ্যাম্ফেটামাইচাইন

4

আমি শেষ পর্যন্ত এটি পরীক্ষা-ত্রুটির প্রক্রিয়াটির মধ্য দিয়ে খুঁজে পেয়েছি। সমাধান একপ্রকার সংশ্লেষিত:

(trap 'true' ERR; exec ttf2afm "$FONT") |
grep ...

স্পষ্টতই আটকে থাকা ত্রুটি সহ সাব-শেল প্রক্রিয়াটি গ্রহণ করার execকারণগুলি ttf2afm, এমন পরিবেশে এটি পরিচালিত করে যেখানে এটি সেগফোল্ট করে যদি কিছু যায় আসে না।

অল-ইনক্লুসিভ ERRসিগন্যালটি আটকে রাখার ফলে সাবস্কেলটি মারা যাওয়া এবং মূল স্ক্রিপ্টে একটি সংকেত প্রেরণ করা বন্ধ হবে – যা যদি প্রোগ্রামটি ব্যর্থ হয় - তা যদি তা ঘটে তা অবিলম্বে শেষ হবে।

একমাত্র সমস্যাটি হ'ল কার্নেল নিজেই প্রক্রিয়াটি segfaults একবার সরাসরি কনসোল ডিভাইসে সম্পূর্ণ স্ট্যাক ট্রেস আবর্জনা আউটপুট দেবে , সুতরাং এটি আউটপুট হওয়া থেকে রোধ করার কোনও উপায় নেই [যা আমি জানি], তবে এটি কোনও ব্যাপার নয় that এটি স্টাডাউট বা স্টডারকে প্রভাবিত করে না।


3
এটি আপনার জন্য কাজ করে তবে আমি আনন্দিত, তবে আমি আত্মবিশ্বাসের সাথে দাবি করতে পারি যে এটি কাজ করার কারণ নয় কারণ বাশ আউটপুট বাফার আকারটি 0 এ সেট করছে Bash ব্যাশ ttf2afmসরাসরি ব্যবহার করা বাফারিংকে প্রভাবিত করতে পারে না । আমি আশ্চর্য হই যে কীভাবে (trap true ERR; exec ttf2afm "$FONT")| …আলাদা আচরণ করতে পরিচালিত হয় ttf2afm "$FONT" | …
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.