প্রোগ্রাম আউটপুট পুনর্নির্দেশ


11

সিনট্যাক্স (উদাহরণস্বরূপ foo 2> myfile) "এর চেয়ে কিছু বেশি সংখ্যক" সহ প্রোগ্রাম আউটপুট পুনর্নির্দেশের চেষ্টা করার সময় , এখানে সম্ভাব্য সংখ্যাগুলি কী এবং তারা কী উপস্থাপন করে?

আমি বিশ্বাস করি 1 হ'ল /dev/stdout, 2 হ'ল /dev/stderr। 5 এবং 6 সম্পর্কে কি? 3, 4 বা 6 এর চেয়ে বেশি কিছু আছে?


উত্তর:


11

এই অনুমিত প্রোগ্রামটি আপনার নির্দিষ্ট করা ফাইল বর্ণনাকারী সংখ্যায় লিখবে। নিম্নলিখিত হ্যালো ওয়ার্ল্ড প্রোগ্রাম বিবেচনা করুন:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

এটি সংকলন

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

এখন একটি সহজ রান

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

5 এর জন্য কোনও ফাইল নেই, তাই কোনও বাইট লেখেনি।

পরবর্তী চেষ্টা:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

আমি একটি ফাইল এবং একটি ফাইল বর্ণনাকারী (যেমন 5>u) নির্দিষ্ট করার সময় একটি আউটপুট পেতে পরিচালনা করি ।

অনুশীলনে, আপনি উপরের মতো মজাদার প্রোগ্রাম না লিখে আপনার ব্যবহার করে ডেটা সংগ্রহের সম্ভাবনা কম 5>foo

শেল স্ক্রিপ্টে <() ব্যবহার করে নির্মাণ করা আরও দরকারী f

 diff <( cmd -par 1 ) <(cmd -par 2)

write()প্রত্যাবর্তন ssize_t, না int
অ্যান্ড্রু হেনেল

এটি প্রশ্নের মূল বিষয় নয়, প্রিন্টফ ফাংশনটির জন্য একটি রিটার্নও রয়েছে।
আরকেমার

প্রত্যাবর্তিত মানটি ব্যবহার না করা ভুল ধরণের ব্যবহার থেকে সম্পূর্ণ আলাদা ।
অ্যান্ড্রু হেনেল

সম্পাদিত আমি আউটপুটটিতে কোনও পরিবর্তন দেখতে পাচ্ছি না ...
আরচেমার

10

সংখ্যাগুলি ফাইল বর্ণনাকারীদের উপস্থাপন করে (যে ফাইলগুলি খোলা হয়েছে তাতে হ্যান্ডলগুলি)

শেলটিতে সাধারণত 3 টি স্বয়ংক্রিয়ভাবে সেট থাকে,

0 - স্টাডিন 1 - স্টাডআউট 2 - স্টার্ডার

তবে আরও ফাইল খোলা যেতে পারে, এবং সংখ্যা বৃদ্ধি।


7

এই সংখ্যাগুলি ফাইল বর্ণনাকারী । যেমন আপনি উল্লেখ করেছেন, এখানে কয়েকটি রয়েছে যা স্বয়ংক্রিয়ভাবে তৈরি হয়। অন্যান্য ফাইল বা ফাইল-জাতীয় জিনিসগুলি খোলার সাথে সাথে তারা অন্যান্য নম্বর পাবে।

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

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

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

কোনও প্রক্রিয়া কোন ফাইল বর্ণনাকারী খোলা আছে এবং সন্ধানের মাধ্যমে সেগুলি কোথায় খোলা রয়েছে তা আপনি দেখতে পাচ্ছেন /proc/<pid>/fd। এটি সেই প্রক্রিয়াটির জন্য সমস্ত ওপেন ফাইল বর্ণনাকারী <pid>এবং কী ফাইলগুলির সাথে যুক্ত রয়েছে তা দেখায় ।


0

যে কোনও প্রক্রিয়া ফাইল বর্ণনাকারী হিসাবে পূর্ণসংখ্যার নম্বর পায়, যেখানে পসিক্সে তিনটি সংরক্ষিত থাকে: 0 স্টিডিন হয়, 1 টি স্টাডআউট এবং 2 টি স্টার্ডার হয়। আরও যে কোনও ফাইল আরও নম্বর বরাদ্দ করা হবে। আপনি এই প্রোগ্রামটি দিয়ে এটি সহজে পরীক্ষা করতে পারেন, এটিকে fdtest.c হিসাবে সংরক্ষণ করুন , যাতে রানটাইমের সময় এটির নিজস্ব প্রোগ্রাম কোডটি খুলতে পারে:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

এটি সংকলন:

gcc fdtest.c -o fdtest

চালাও এটা:

./fdtest

আউটপুট আপনি পাবেন এরকম কিছু:

3

... যা ভেরিয়েবল দ্বারা উল্লিখিত ফাইলের ফাইল বর্ণনাকারীর সংখ্যা fd

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