সিপি ওভাররাইট বনাম আরএম তারপর সিপি


18

আমি যখন যে বর্তমানে চালু একটি বাইনারি ফাইলটি প্রতিস্থাপন করার চেষ্টা করুন, cpওভাররাইট করতে ব্যর্থ, কিন্তু এটা করা সম্ভব rmতারপর, এটা cp। উদাহরণ স্বরূপ:

user@poste:~$ cp binaryFile /tmp
user@poste:~$ sudo cp /tmp/binaryFile binaryFile 
[sudo] password for user:
cp: cannot create regular file `binaryFile`: Text file busy
user@poste:~$ sudo rm binaryFile 
user@poste:~$ sudo cp /tmp/binaryFile  binaryFile 
user@poste:~$ file binaryFile 
binaryFile : ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x7ce005d9eb50e2574246b6a881e625802f7e49f2, not stripped

কোন ধারণা কেন?


2
আকর্ষণীয় ছোট থ্রেড, তবে ইউনিক্স / লিনাক্স.এসই আইএমওতে থাকা উচিত।
আন্ডারস্কোর_

উত্তর:


41

প্রথম ক্ষেত্রে, আপনি বর্তমানে কোনও প্রোগ্রাম হিসাবে চলমান কোনও ফাইলের সামগ্রীগুলি ওভাররাইট করার চেষ্টা করছেন । লিনাক্স এটিকে অনুমতি দেয় না - যদি এটি করা থাকে তবে আপনি ওএসের সম্পাদনকারী কোডটি ঠিক ঠিক ওভাররাইট করে ফেলবেন; প্রথম পার্থক্যটি প্রোগ্রামটি ক্র্যাশ করবে বা এটিকে ত্রুটিযুক্ত করবে।

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

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

সিস্টেমগুলি তাদের ইনোড দ্বারা ব্যবহারযোগ্য ফাইলগুলিকে রেফারেন্স করে, সুতরাং তাদের একই ফাইলের নাম থাকা উচিত নয় - এটি এখনও পুরানো ফাইল যা সিস্টেমের দ্বারা উন্মুক্ত রয়েছে, এবং এর কোনও লিঙ্ক না থাকলেও এটি কেবল মুছে ফেলা হবে সমস্ত প্রোগ্রাম একবার এটি বন্ধ।


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

2
এ কারণেই আপনি যখন কোনও চলমান প্রক্রিয়ার কিছু লগ ফাইল মুছবেন তখন df কমান্ড প্রক্রিয়াটি না থামানো পর্যন্ত সঠিক আকারটি ফিরিয়ে দেয় না
M4rty

কোনও বাহ্যিক প্রোগ্রাম (রুট প্রিলিভিডিজ সহ) এই ঝোলা ইনোডের জন্য একটি নতুন হ্যান্ডেল সন্ধান এবং তৈরি করার কোনও উপায় আছে কি? আমি কল্পনা করেছি এমন কিছু প্রোগ্রাম রয়েছে যা এটি "সুরক্ষা বৈশিষ্ট্য" হিসাবে ব্যবহার করে তাই পুরো গল্পটি বোঝা আকর্ষণীয়।
বেনপেন

3
@ বেনপেন: লিনাক্সে, হ্যাঁ - /proc/*/fdএটি অ্যাক্সেস করতে ব্যবহার করুন এবং ফাইল সিস্টেমে একটি নতুন লিঙ্ক যুক্ত করতে বিকল্পভাবে লিংক্যাট () ব্যবহার করুন।
user1686

3
@BenPen এবং grawity: বাস্তবিক, আপনি ডিরেক্টরি গঠন মধ্যে একটি inode ফিরে লিঙ্ক করতে পারেন না যদি এটা শূন্য লিঙ্ক আছে, এমনকি linkat()সুরক্ষা জনিত কারণে । : (যদি না তা দিয়ে তৈরি করা হয়েছে এই নিয়মের ব্যতিক্রম open(O_TMPFILE)তাই এটি শুরু আপনি চেষ্টা করেন, তাহলে শূন্য লিঙ্ক সহ।) linkat()এমনকি রুট হিসাবে আয় ENOENT। আমার উত্তর আসলে চালানোর জন্য একটি Perl স্ক্রিপ্টের জন্য যে প্রশ্ন দেখতে linkat/: এমনকি রুট হিসাবে, এবং যে এটা কাজ করে না প্রমাণ
পিটার Cordes
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.