dup2 / dup - আমার কেন একটি ফাইল বর্ণনাকারীর নকল করতে হবে?


85

আমি ব্যবহার বোঝার চেষ্টা করছি dup2এবং dup

ম্যান পৃষ্ঠা থেকে:

আমার কেন সেই সিস্টেম কল দরকার? ফাইল বর্ণনাকারীর সদৃশ ব্যবহার কি?

আমার কাছে যদি ফাইল বর্ণনাকারী থাকে তবে আমি কেন এটির একটি অনুলিপি তৈরি করতে চাই?

আমি প্রশংসা করব যদি আপনি ব্যাখ্যা করতে পারেন এবং আমাকে যেখানে প্রয়োজন dup2/ আমাকে উদাহরণ দিতে পারেন তবে dup

ধন্যবাদ


আপনি কীভাবে dupবা ছাড়া শেলের পাইপ কার্যকারিতা বাস্তবায়ন করবেন dup2? আপনাকে কল করতে হবে pipe(2)এবং তারপরে ফাইল বর্ণনাকারীদের মধ্যে একটি থাকতে হবেdupSTDIN_FILENO
বেসাইল স্টারিনকিভিচ

উত্তর:


48

ডুপ সিস্টেম কলটি একটি বিদ্যমান ফাইল বর্ণনাকারীকে নকল করে, একটি নতুন ফিরিয়ে দেয় যা একই অন্তর্নিহিত I / O অবজেক্টকে বোঝায়।

ডুপ শেলগুলি এই জাতীয় কমান্ড প্রয়োগ করতে দেয়:

2> & 1 শেলটিকে একটি ফাইল বর্ণনাকারী 2 দেওয়ার জন্য শেলকে বলে যা ডেস্ক্রিপ্ট 1 এর সদৃশ। (যেমন স্ট্যাডার এবং স্টাডআউট পয়েন্ট একই এফডি)।
এখন কল করার জন্য ত্রুটির বার্তা উপর অ বিদ্যমান ফাইল এবং সঠিক আউটপুট উপর বিদ্যমান ফাইল আপ শোতে tmp1 ফাইল।

নিম্নলিখিত উদাহরণ কোড একটি পাইপের রিড প্রান্তের সাথে সংযুক্ত স্ট্যান্ডার্ড ইনপুট সহ প্রোগ্রাম ডাব্লুসিটি চালায়।

শিশুটি ফাইলের বর্ণনাকারী 0 এ পড়ার প্রান্তটি ডুপ করে, পি-তে ফাইল ডি স্ক্রিপ্টারগুলি বন্ধ করে এবং ডাব্লিউসি চালায়। ডাব্লুসি যখন তার স্ট্যান্ডার্ড ইনপুট থেকে পড়ে, এটি পাইপ থেকে পড়ে।
এইভাবে পাইপগুলি ডুপ ব্যবহার করে প্রয়োগ করা হয়, ভাল যে ডুপের একটি ব্যবহার এখন আপনি অন্য কোনও কিছু তৈরি করতে পাইপ ব্যবহার করেন, এটি সিস্টেম কলগুলির সৌন্দর্য, আপনি ইতিমধ্যে সেখানে থাকা সরঞ্জামগুলি ব্যবহার করে একের পর এক জিনিস তৈরি করেন, এই সরঞ্জামগুলি ব্যবহার করে নির্মিত হয়েছিল অন্তর্নির্মিত অন্য কিছু .. শেষ দিকে সিস্টেম কলগুলি কর্নেলের মধ্যে পাওয়া সবচেয়ে প্রাথমিক সরঞ্জাম

চিয়ার্স :)


4
সুতরাং dupকলারের পক্ষে সহায়ক এবং lsপ্রোগ্রামটি নিজেই নয়? dupইতিমধ্যে ফাইলটিতে অ্যাক্সেস থাকলে LS এর মতো প্রোগ্রামে ব্যবহার করার কোনও সুবিধা আছে কি ? এখানে উদাহরণস্বরূপ, lsত্রুটিগুলি লিখুন 2যা হার্ডকডযুক্ত, তাই আমার এটির গ্রাহক হিসাবে ওভার রাইড করার একটি উপায় আছে ls। আমি মনে করি একটি সূক্ষ্ম বিন্দু না?
নিশান্ত

4
আপনার উদাহরণস্বরূপ প্রোগ্রামটিতে একটি বাগ রয়েছে বলে মনে হচ্ছে ; আপনি কল করছেন dup(p[STDIN])তবে ফলাফলটি ফেলে দিচ্ছেন। আপনি কি ব্যবহার করতে চান dup2(p[STDIN], 0)?
কুক্সপ্লসোন

4
@ কুইকপ্লসোন dup"প্রক্রিয়াটির দ্বারা বর্তমানে ব্যবহৃত না সর্বনিম্ন সংখ্যাযুক্ত বিবরণীটি ফিরিয়ে দেয়"। যেহেতু fd 0 সবে বন্ধ ছিল, dup0. ফিরে আসা উচিত , dup2কোন এফডি ব্যবহার করা উচিত সে সম্পর্কে স্পষ্টভাবে বলা হয়েছে, কেবলমাত্র সর্বনিম্ন নিখরচায় এফডি ব্যবহার করার পরিবর্তে, আমি এটি পছন্দ করব।
Wodin

@ ওডিন: আহা, আমি বাজি দিয়েছি যে আপনি ওপি কী ভাবছেন তা সম্পর্কে সঠিক। আমি কি ঠিক বলেছি, যদিও "সবেমাত্র বন্ধ" আপেক্ষিক, এবং ওপির কোডটি উপস্থিত হতে পারে, উদাহরণস্বরূপ, সমবর্তী থ্রেড যা ফাইলগুলিও খোলার সম্ভাবনা রয়েছে?
কুইকসপ্লসোন

@ কুইকপ্লসোন আপনার সন্দেহ হয়েছে যে আপনি ঠিক বলেছেন, তবে নিশ্চিতভাবে জানেন না। তবে সেক্ষেত্রে আপনার অন্যান্য সমস্যা হবে। যদি আপনি স্টিডিনটি বন্ধ করে দেন কারণ আপনি অন্য কোথাও থেকে পড়তে চান এবং তার পরে অন্য থ্রেড একটি ফাইল খুলবে, এটি এফডি 0 পাবেন you এখন আপনি যে ফাইলটি খোলেন সেখান থেকে (এবং লিখতে?) পড়া হবে। যাইহোক, আমি যদি সঠিকভাবে মনে রাখি তবে আপনাকে exec*কোনও মাল্টিথ্রেডেড প্রক্রিয়া থেকে কল করা উচিত নয় । তবে আমি কোনও থ্রেডিং বিশেষজ্ঞ নই :)
Wodin

18

কোনও ফাইল বর্ণনাকারীর সদৃশ করার অন্য একটি কারণ এটি ব্যবহার করে fdopenfcloseপাস করা ফাইল ডেস্ক্রিপ্টরটি বন্ধ করে দেয় fdopen, তাই যদি আপনি না চান যে মূল ফাইল বর্ণনাকারী বন্ধ হয়ে যায়, আপনাকে dupপ্রথমে এটির নকল করতে হবে ।


fdopen()মনে হয় কোনও ফাইল বর্ণনাকারীর সদৃশ হয় না, এটি কেবল ব্যবহারকারী জায়গাতে বাফার তৈরি করে।
ব্যবহারকারী 218867

4
আপনি আমার উত্তর ভুল লিখেছেন। পয়েন্ট যে আপনি চাইবেন হয় dupএটি ক্ষণস্থায়ী আগে FD fdopenযেহেতু fcloseএটা বন্ধ করে দেব।
আর .. গীটহাব বন্ধ করুন ICE

4
@ theferrit32: আপনি যদি স্টিডিও FILEইন্টারফেসের মাধ্যমে একটি প্রাইসিসিস্টিং ওপেন ফাইল অ্যাক্সেস করার জন্য একটি হ্যান্ডেল বরাদ্দ করেন তবে আপনাকে সেই হ্যান্ডেলটিকে অবনত করতে কল fcloseকরতে হবে FILE। আপনাকে অন্তর্নিহিত খোলা ফাইল ব্যবহার করে, বা রাখতে চান আপনার সফ্টওয়্যার স্থাপত্য এমন হলে যে ফাইল বর্ণনাকারী জন্য মূল "মালিক" কোড হবে closeএটা যে, আসলে fcloseআরো অন্তর্নিহিত ফাইল বর্ণনাকারী আপনাকে হস্তান্তর বন্ধ fdopenএকটি সমস্যা। আপনি এই সমস্যাটি এড়াতে পারবেন dupএকই খোলা ফাইলটি পাস করার জন্য একটি নতুন ফাইল বর্ণনাকারী তৈরি করে fdopen, যাতে fcloseএটির আসলটি বন্ধ হয় না।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

4
পয়েন্ট যে fdopen () হল চলে আসে করার FD মালিকানা FILEবদলে অনুলিপি করুন। এটি ব্যবহারকারীদের সচেতন হওয়া উচিত। যে গ্রাহকরা অবজেক্টের fdপাশাপাশি ব্যবহারযোগ্য হ্যান্ডেলটি ধরে রাখতে FILEহবে তাদের অবশ্যই নকল করতে হবে fd। এখানেই শেষ.
কনরাড মায়ার

4
@ কনরাডমায়ার: হ্যাঁ, এটি স্থাপনের একটি খুব ভাল উপায়, একটি নোট সহ যে FILEআপনি যখন মালিকানা এখান থেকে সরিয়ে নেবেন তখন থেকে "মালিকানা সরিয়ে নেওয়া" চালানোর কোনও ব্যবস্থা নেই ।
আর .. গীটহাব বন্ধ করুন সহায়তা আইসিসি

4

ডুপ একটি প্রক্রিয়া থেকে আউটপুট পুনর্নির্দেশ করতে সক্ষম হতে ব্যবহৃত হয়।

উদাহরণস্বরূপ, আপনি যদি কোনও প্রক্রিয়া থেকে আউটপুট সংরক্ষণ করতে চান, আপনি আউটপুটটিকে নকল করুন (fd = 1), আপনি নকল করা fd কোনও ফাইলে পুনর্নির্দেশ করুন, তারপরে প্রক্রিয়াটি কাঁটাচামচ করুন এবং প্রক্রিয়াটি শেষ হলে আপনি আবার পুনঃনির্দেশ করুন আউটপুট এফডি সংরক্ষণ করা।


4

ডুপ / ডুপ 2 সম্পর্কিত কিছু পয়েন্ট দয়া করে উল্লেখ করা যেতে পারে

dup / dup2 - প্রযুক্তিগতভাবে উদ্দেশ্য হ'ল বিভিন্ন হ্যান্ডলগুলি দ্বারা একটি একক প্রক্রিয়ার ভিতরে একটি ফাইল টেবিল এন্ট্রি ভাগ করা । (আমরা যদি ডিস্ট্রিপ্টারটি কাঁটাতে পারি তবে শিশু প্রক্রিয়াতে ডিফল্টরূপে নকল করা হয় এবং ফাইল সারণী প্রবেশও ভাগ করে নেওয়া হয়)।

এর অর্থ আমরা সম্ভবত একাধিক ফাইলের বর্ণনাকারীর আলাদা আলাদা বৈশিষ্ট্য থাকতে পারি ডুপ / ডুপ 2 ফাংশন ব্যবহার করে একটি একক ওপেন ফাইল টেবিল এন্ট্রির জন্য থাকতে পারে।

(যদিও বর্তমানে কেবল এফডি_সিএলএক্সইসিইসি পতাকাটি কোনও ফাইল বর্ণনাকারীর একমাত্র বৈশিষ্ট্য))

http://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html

পার্থক্যগুলি হ'ল (শেষের জন্য) - কিছু ভুল মান ব্যান্টিন ডুপ 2 এবং এফসিএনটিএল দ্বারা অনুসরণ করা fcntl এর পরে দুটি ফাংশন কল জড়িত থাকার কারণে জাতি শর্ত বাড়িয়ে তুলতে পারে।

বিশদটি http://pubs.opengroup.org/onlinepubs/009695399/function/dup.html থেকে চেক করা যায়

ব্যবহারের একটি উদাহরণ -

শেলটিতে জব কন্ট্রোল বাস্তবায়নের সময় একটি আকর্ষণীয় উদাহরণ, যেখানে ডুপ / ডুপ 2 ব্যবহার দেখা যায় .. নীচের লিঙ্কটিতে

http://www.gnu.org/software/libc/manual/html_node/ লঞ্চিং- জবস এইচটিএমএল# লঞ্চিং -জবস

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