পাইপ অস্থায়ী ফাইল লিখতে আছে?


11

আমি পাইপের মাধ্যমে দুটি প্রসেসের মধ্যে প্রচুর পরিমাণে তথ্য স্থানান্তরিত করলে, কিছু অস্থায়ী ফাইল linux / tmp ডিরেক্টরিতে তৈরি করা হবে। পাইপ অপারেশন সফল হলে, সংশ্লিষ্ট অস্থায়ী ফাইল স্বয়ংক্রিয়ভাবে OS দ্বারা সরানো হবে। কিন্তু অপারেশন ব্যর্থ হলে, TMP ফাইল সেখানে রয়ে যায়।

কিছু কারণে, আমি পাইপের মাধ্যমে তথ্য স্থানান্তরিত করার জন্য ব্যবহারকারীর কাছে সুযোগ চাই না, তাই আমার প্রোগ্রাম ক্র্যাশ হওয়া সত্ত্বেও হার্ডডিস্কে থাকা কিছু বাকি নেই। কিভাবে আমি এটি করতে পারব?


3
আমি খুব সন্দেহজনক যে ওএস এই ফাইলগুলি তৈরি করছে, বিশেষ করে, আমি এটা পাইপ অপারেশন সন্দেহ।

@ নাইল: খুব ভাল পয়েন্ট। @OP: আপনি কি নিশ্চিত যে রিসিভার tmp ফাইলটিতে stdin এ প্রাপ্ত তথ্য ক্যাশে না করে? যদি এটি আপনার নিজস্ব কোড না এবং ওপেন সোর্স না হয় তবে আপনি সম্ভবত আপনার প্রেরকের কাছ থেকে আপনার আউটপুটটিকে একটি ফাইলতে পুনঃনির্দেশিত করে চেক করতে পারেন এবং তারপরে রিসিভার প্রক্রিয়াতে তার ইনপুট স্ট্রিম হিসাবে প্রেরণ করে, উদাহরণস্বরূপ: sender > filename তারপর receiver < filename। আমি উভয় ops সময় tmp ফাইল চেক চাই, প্রেরক বা রিসিভার এটি করছেন কিনা তা দেখতে।

2
একটি উত্তর নেই, তবে এখানে পাইপ হ্যান্ডলিং সম্পর্কিত অনেক দরকারী তথ্য পাওয়া গেছে: & lt; slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible করুন & gt; । এই ব্যক্তিটি কতটা কর্তৃত্বপূর্ণ তা জানি না, তবে তিনি বিশেষভাবে উল্লেখ করেছেন যে a mkfifo -created পাইপ কোন বাফার না (সব সময়ে!) এবং ফাইল তৈরি করে না।
Carl Smotricz

1
@ কার্ল স্মোট্রিক্স: লিঙ্কটি ভাঙা হয়েছে, তাই এখানে: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

এছাড়াও, পাইপটি যদি পূর্ণ হয় তবে পাইপের কাছে লেখাটি ব্লক করা হবে (অন্য কেউ অন্য প্রান্ত থেকে পড়া না হওয়া পর্যন্ত)।

উত্তর:


11
  1. পাইপ ডিস্ক উপর তথ্য সংরক্ষণ করবেন না। / bin / echo foo | grep বার কোন ফাইল তৈরি করে না। চেষ্টা strace -f sh -c '/bin/echo foo | grep bar' একটি পাইপলাইন চলমান যখন একটি শেল দ্বারা তৈরি সব সিস্টেম কল দেখতে। echo একটি শেল নির্মিত হয়, তাই আমি প্রস্তাব /bin/echo শেল একটি এক্সিকিউটেবল চালানোর জন্য।

  2. /tmp ডিস্ক হতে হবে না। এটি tmpfs (যেমন ভার্চুয়াল মেমরি দ্বারা সমর্থিত) উপর মাউন্ট করা যেতে পারে। একটি রিবুট খালি হবে মনে রাখবেন /tmp যে ক্ষেত্রে, তাই ব্যবহার করুন /var/tmp আপনি প্রায় যেতে চান কিছু জন্য।

যদি আপনি যা করছেন তা একটি ফাইলের মধ্যে তথ্য নির্বাণ করা হয় তবে এটি একটি পাইপ ব্যবহার করে না। যদি ফাইলটি একটি ফিফো হয় তবে একটি নিয়মিত ফাইল নয়, তবে এটি কেবল একটি নামকরণের উপাত্ত এবং এতে ডেটা নেই। খুঁজে বের করতে ls -l ব্যবহার করুন।

এবং মনে রাখবেন যে ব্যবহারকারীরা যদি তাদের প্রক্রিয়াগুলির মধ্যে পাইপগুলির মাধ্যমে কী ঘটছে তা দেখার জন্য ব্যবহারকারীদের থামাতে প্রত্যাশিত হন, তবে আপনি খুব বেশি সোলো, কারণ strace সবকিছু প্রক্রিয়া পরিদর্শন করতে পারেন যা প্রসেসের বাইরে কিছু নিয়ে মিথস্ক্রিয়া করে, এমএমপিড শেয়ার্ড মেমরি পড়ার / লেখার ব্যতীত। ltrace এমনকি আরও আক্রমণাত্মক হয়। যদি আপনার প্রোগ্রামটি স্থানীয় ব্যবহারকারীর রুটগুলির সিস্টেমে চলবে তবে আপনি এগুলিকে থামাতে পারবেন না। ইউনিক্সে, রুট কিছু করতে পারে এবং এর জন্য শক্তিশালী সরঞ্জাম রয়েছে।


1

একটি সত্য পাইপ কার্নেলের মেমরির একটি ব্লক, একটি বাফার যা কিছু প্রক্রিয়া দ্বারা পড়তে / লিখিত হয়। এটা কোথাও ফাইল তৈরি করে না।

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


0

মলিন হ্যাক: পাঠানোর আগে তথ্য এনক্রিপ্ট করুন এবং যদি আপনি উভয় প্রসেসগুলি পরিবর্তন করতে পারেন তবে এটি ডিক্রিপ্ট করুন ...


এটি একটি নোংরা হ্যাক কল না, আসলে: তথ্য সংবেদনশীল হয়, একটি উপযুক্ত সমাধান মনে হয়। কিন্তু আমি tmp ফাইল সম্পর্কে অদ্ভুত। OP ঠিক আছে কার্নেল এটি তৈরি করছে? অথবা নাইল ডান এবং এটি পাইপ বা অন্য এক শেষ ...

কার্নেল একটি অস্থায়ী ফাইল তৈরি করছে না। অন্যদিকে, খুব সম্ভবত এটি গ্রহণযোগ্য প্রক্রিয়াটি একটি অস্থায়ী ফাইল তৈরি করছে। এটি খুবই সাধারণ, যেহেতু আপনি আপনার ইনপুট সন্ধান করতে চান তবে আপনাকে এটি প্রথমে একটি ফাইলতে লিখতে হবে।
larsks
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.