নামী পাইপে সমবর্তী লেখার গ্যারান্টি কী?


32

উদাহরণস্বরূপ, আমি নিম্নলিখিতগুলির মতো একটি নামযুক্ত পাইপ তৈরি করেছি:

mknod myPipe p

এবং আমি এটি থেকে কিছু প্রক্রিয়া (উদাহরণস্বরূপ, কিছু সার্ভার) থেকে পড়েছি। উদাহরণস্বরূপ, আমি লেজ ব্যবহার করেছি:

tail -f myPipe

যদি বেশ কয়েকটি ক্লায়েন্ট প্রক্রিয়া এতে কিছু বার্তা লেখেন (উদাহরণস্বরূপ, echo "msg" >> myPipeবার্তাগুলি আন্তঃবিশ্বিত হওয়ার কিছু সম্ভাবনা রয়েছে, যেমন:

 <beginning of message1><message2><ending of message1>

নাকি নামযুক্ত পাইপে লেখার প্রক্রিয়াটি কি পারমাণবিক?

উত্তর:


29

এটি প্রতিটি প্রক্রিয়া কতটা লিখছে তার উপর নির্ভর করে (ধরে নিলে আপনার ওএস এই ক্ষেত্রে পসিক্স-অনুগত)। থেকে write():

কোনও পাইপে অনুরোধগুলি লিখুন বা FIFO নিম্নলিখিত ব্যতিক্রমগুলির সাথে নিয়মিত ফাইলের মতো একইভাবে পরিচালনা করা হবে:
[...]

  • Pipe PIPE_BUF} বাইট বা তার চেয়ে কম লিখিত অনুরোধগুলি একই পাইপটিতে লেখার সময় অন্য প্রক্রিয়াগুলির ডেটা দিয়ে ইন্টারলিভ করা হবে না । Status PIPE_BUF than বাইটের বেশি লেখার ক্ষেত্রে অন্য প্রক্রিয়াগুলির দ্বারা লেখার সাথে স্বেচ্ছাসেবী সীমানায় ডেটা ইন্টারলিভড থাকতে পারে, ফাইলের স্থিতির পতাকাগুলির ও_নোনব্ল্যাক পতাকা সেট করা আছে কি না।

এছাড়াও নীতি অধ্যায় পাইপ এবং FIFOs সংক্রান্ত:

  • পারমাণবিক / অ-পরমাণু : একটি অপারেশনে লিখিত পুরো পরিমাণ অন্য কোনও প্রক্রিয়া থেকে প্রাপ্ত ডেটা দিয়ে ইন্টারলিভ না করা হলে একটি রচনা পারমাণবিক। একাধিক লেখক যখন একক পাঠকের কাছে ডেটা প্রেরণ করেন তখন এটি কার্যকর হয়। অ্যাপ্লিকেশনগুলি জানতে হবে যে কত বড় একটি লিখিত অনুরোধ পারমাণবিকভাবে সম্পাদিত হবে বলে আশা করা যায়। এই সর্বোচ্চটিকে {PIPE_BUF U বলা হয়} POSIX.1-2-2008 এর এই ভলিউমটি {PIPE_BUF} বাইটের বেশি লেখার অনুরোধটি পারমাণবিক কিনা তা জানায় না, তবে {PIPE_BUF of বা আরও কম বাইটের লেখার দরকার পরমাণু হতে পারে।

মানটি PIPE_BUFপ্রতিটি প্রয়োগের দ্বারা সংজ্ঞায়িত করা হলেও সর্বনিম্ন 512 বাইট (দেখুন limits.h)। লিনাক্সে এটি 4096 বাইট (দেখুন pipe(7))।


5
পিআইপি.ইউ.বি.উ.এফ, যাইহোক, কমপক্ষে 512 হওয়ার নিশ্চয়তা রয়েছে Note মনে রাখবেন যে আপনার গ্যারান্টিটিও আপনাকে দিতে হবে যে আপনার প্রক্রিয়াটি আসলে প্রতিটি লাইনকে একটি লিখিত কলে লিখেছিল। লাইন বাফারিং সক্ষম করা ( setvbuf(stdout, NULL, _IOLBF,512)) আপনাকে নিম্ন-স্তরের ফাংশন ব্যবহার করার প্রয়োজন ছাড়াই এটি করবে।
র্যান্ডম 832

PIPE_BUFসাধারণ ইউনিক্স সিস্টেমে পর্যবেক্ষণকৃত মানগুলির একটি সারণি এখানে রয়েছে : ar.to/notes/posix#pipe-buf
Arto Bendiken

আমি বুঝতে পারি না কীভাবে সকেটগুলি মাল্টিপ্লেক্স করা যায় ... তবে নামযুক্ত পাইপগুলি পারবেন না ?? ইউনিক্সের সবকিছু ঠিক একটি ফাইল ঠিক আছে? লুলজ
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস: আমি আপনার মন্তব্য বুঝতে পারি না
ম্যাট

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