একটি "সাবশেল" এবং "শিশু প্রক্রিয়া" এর মধ্যে সঠিক পার্থক্য কী?


16

এটি এবং এটি অনুসারে , বন্ধনী ব্যবহার করে একটি সাবশেল শুরু করা হয় (…)

( echo "Hello" )

মতে এই , এই এবং এই , একটি প্রক্রিয়া যখন কমান্ড একটি দিয়ে শুরু হয় forked হয়&

echo "Hello" &

পোজিক্স স্পেসিফিকেশন এই পৃষ্ঠায় শব্দটিsubshell ব্যবহার করে তবে এটি সংজ্ঞা দেয় না এবং একই পৃষ্ঠায় "শিশু প্রক্রিয়া" সংজ্ঞায়িত করে না

দুজনেই কার্নেল fork()ফাংশন ব্যবহার করছেন, তাই না ?

কিছু কাঁটাচামচকে "সাব-শেল" এবং কিছু অন্য কাঁটাচামচকে "শিশু প্রক্রিয়া" বলার ক্ষেত্রে ঠিক পার্থক্য কী।


আপনি কেন পসিএক্স যুক্তি যুক্ত করছেন তা পরিষ্কার নয় : বেস সংজ্ঞাগুলির পরিবর্তে বেস সংজ্ঞাগুলি তাদের নিজস্ব: 3.93 শিশু প্রক্রিয়া "প্রদত্ত প্রক্রিয়া দ্বারা একটি কাঁটা (), পোস্টিক্স_স্পেন () বা ...) তৈরি করা একটি নতুন প্রক্রিয়া" ; ৩.37376 সাবশেল "শেল এক্সিকিউশন এনভায়রনমেন্ট, মূল বা বর্তমান শেল এক্সিকিউশন পরিবেশ থেকে পৃথক" । সুতরাং, একই ধরণের জিনিসগুলির উদাহরণ নয়। আপনি যে সন্ধান করছেন এটি কি এই পার্থক্য?
ফ্রে-সান

@ ফ্রে-সান এ এর ​​থেকে child processআলাদা একটি পরিবেশ থাকতে পারে main: পছন্দ মতো ( LANG=C eval 'echo "$LANG"' )। সেই শিশু প্রক্রিয়াটি (প্রথম বন্ধনের অভ্যন্তরে) কি একটি সাব-শেল (বিভিন্ন পরিবেশ) রয়েছে?
আইজাক

মত প্রকাশের ( )হয় সংজ্ঞা দ্বারা নিজস্ব সঞ্চালনের পরিবেশের সঙ্গে একটি subshell। আমার বক্তব্যটি হ'ল একটি সাব-শেল শিশু প্রক্রিয়া হিসাবে প্রয়োগ করা প্রয়োজন হয় না (যেমন স্টাফেন তার উত্তরে ksh93 উদাহরণ দিয়ে উল্লেখ করেছেন)। দেখে মনে হচ্ছে সাব-শেল এবং শিশু প্রক্রিয়া কোনও কলের ফলাফল উভয়ই হতে পারে না fork(); সুতরাং, দুই ধরণের কাঁটাচামচ মধ্যে পার্থক্য সন্ধান করা আমার কাছে সঠিক দৃষ্টিভঙ্গি বলে মনে হয় না। এজন্য আমি আপনার প্রশ্নটি আরও ভাল করে বোঝার চেষ্টা করছিলাম।
ফ্রে-সান

আহ, এখন আমি দেখতে যে tldp আপনি যে পৃষ্ঠাটি আসলে লিঙ্ক বলছেন যে একটি subshell হয় একটি শিশু প্রক্রিয়া। আমার মতে এই সংজ্ঞা সম্ভবত বিভ্রান্তিকর সরলীকরণ।
ফ্রে-সান

উত্তর:


15

পসিক্স পরিভাষায় শেল এক্সিকিউশন এনভায়রনমেন্টের ধারণার সাথে একটি সাব- শেল পরিবেশ যুক্ত হয়

একটি সাব-শেল এনভায়রনমেন্ট একটি পৃথক শেল এক্সিকিউশন এনভায়রনমেন্ট যা প্যারেন্ট এনভায়রনমেন্টের সদৃশ হিসাবে তৈরি করা হয়। এই কার্যকরকরণের পরিবেশে খোলা ফাইল, উমাস্ক, ওয়ার্কিং ডিরেক্টরি, শেল ভেরিয়েবল / ফাংশন / উপকরণগুলি যেমন ...

সেই সাবশেল পরিবেশে পরিবর্তনগুলি পিতামাতার পরিবেশকে প্রভাবিত করে না।

Ditionতিহ্যগতভাবে বোর্ন শেল বা ksh88 এ যার উপর পসিক্স স্পেসিফিকেশন ভিত্তিক, এটি একটি শিশু প্রক্রিয়া জাল করেই করা হয়েছিল।

পসিক্স যে ক্ষেত্রগুলিতে সাব-শেল পরিবেশে কমান্ড চালানোর জন্য প্রয়োজনীয় বা কমান্ডের অনুমতি দেয় সেগুলি হ'ল traditionতিহ্যগতভাবে ksh88 একটি শিশু শেল প্রক্রিয়াটিকে কাঁটাচামচ করেছে।

এটি বাস্তবায়নের জন্য এটির জন্য শিশু প্রক্রিয়াটি ব্যবহার করতে বাধ্য করে না।

কোনও শেল তার পরিবর্তে যেভাবে পৃথক কার্যকর পরিবেশটি পছন্দ করতে পারে তা বেছে নিতে পারে।

উদাহরণস্বরূপ, ksh93 এটি প্যারেন্ট এক্সিকিউশন এনভায়রনমেন্টের বৈশিষ্ট্যগুলি সংরক্ষণ করে এবং প্রাসঙ্গিক পরিবেশগুলিতে যেখানে কাঁটাচামচ এড়ানো যেতে পারে সেগুলি বন্ধ করার পরে তাদের পুনরুদ্ধার করে (বেশিরভাগ সিস্টেমে কাঁটাচামচ করা যেমন একটি ব্যয়বহুল হিসাবে ব্যয় হয়) does

উদাহরণস্বরূপ, এতে:

cd /foo; pwd
(cd /bar; pwd)
pwd

পসিক্সের cd /fooজন্য আলাদা পরিবেশে চালিত হওয়া এবং এরকম কিছু আউটপুট চালানো দরকার:

/foo
/bar
/foo

এটি একটি পৃথক প্রক্রিয়া চালানোর প্রয়োজন হয় না। উদাহরণস্বরূপ, stdout একটি ভাঙ্গা পাইপ হয়ে ওঠে, pwdসাব-শেল পরিবেশে চালানো খুব ভালভাবে একটি এবং কেবল শেল প্রক্রিয়াতে প্রেরণ করা যেতে পারে the

বেশিরভাগ শেলগুলি শিশু প্রসেসের bashঅভ্যন্তরে কোডটি মূল্যায়ন করে এটি প্রয়োগ করবে (...)(পিতামাতার প্রক্রিয়াটি সমাপ্তির অপেক্ষায় রয়েছে), তবে ksh93 পরিবর্তে কোডটি ভিতরে চালানোর পরে (...)সমস্ত একই প্রক্রিয়াতে শুরু করবে:

  • মনে রাখবেন এটি একটি সাব-শেল পরিবেশে।
  • উপরে cd, পূর্ববর্তী কাজের ডিরেক্টরির (সাধারণত একটি ফাইল বর্ণনাকারী O_CLOEXEC দিয়ে খোলা দিকে), OLDPWD মূল্য গণপূর্ত ভেরিয়েবল এবং কিছু সংরক্ষণ যে সংরক্ষণ cdসংশোধন পারে এবং তারপর কিchdir("/bar")
  • সাব-শেল থেকে ফিরে আসার পরে, বর্তমানের ডিরেক্টরিটি পুনরুদ্ধার করা হয়েছে ( fchdir()সেইভ করা এফডি সহ একটি ), এবং সাব-শেল সংশোধিত হতে পারে এমন সমস্ত কিছু।

এমন প্রসঙ্গ রয়েছে যেখানে একটি শিশু প্রক্রিয়া এড়ানো যায় না। ksh93 কাঁটাচামচ করে না:

  • var=$(subshell)
  • (subshell)

কিন্তু না

  • { subshell; } &
  • { subshell; } | other command

এটি হল, যেসব ক্ষেত্রে বিষয়গুলিকে পৃথক প্রক্রিয়াতে চালিত করতে হয় তাই তারা একযোগে চলতে পারে।

ksh93 অপটিমাইজেশন এর চেয়ে আরও বেশি এগিয়ে যায়। উদাহরণস্বরূপ, ভিতরে থাকাকালীন

var=$(pwd)

বেশিরভাগ শেলগুলি একটি প্রক্রিয়া কাঁটাবে, শিশুটি pwdতার স্টাডআউট দিয়ে একটি পাইপে পুনঃনির্দেশিত করে কমান্ডটি চালাবে, সেই পাইপটিতে pwdবর্তমান ওয়ার্কিং ডিরেক্টরিটি লিখবে, এবং পিতামাতার প্রক্রিয়াটি পাইপের অন্য প্রান্তে ফলাফলটি পড়বে, ksh93সমস্ত কিছু দ্বারা ভার্চুয়ালাইজ করবে কাঁটাচামচ বা পাইপ প্রয়োজন। একটি কাঁটাচামচ এবং পাইপ কেবল অন্তর্নির্মিত কমান্ডের জন্য ব্যবহৃত হত।

মনে রাখবেন যে এমন অন্যান্য প্রসঙ্গ রয়েছে যেগুলি শেলগুলি একটি শিশু প্রক্রিয়া তৈরি করে subs উদাহরণস্বরূপ, একটি পৃথক এক্সিকিউটেবল (এবং এটি একই শেল ইন্টারপ্রেটারের জন্য নির্মিত কোনও স্ক্রিপ্ট নয়) কমান্ড চালাতে শেলকে সেই কমান্ডটি চালানোর জন্য কোনও প্রক্রিয়া তৈরি করতে হবে অন্যথায় এটি হবে না কমান্ড ফিরে আসার পরে আরও কমান্ড চালাতে সক্ষম।

ভিতরে:

/bin/echo "$((n += 1))"

এটি সাবসেল নয়, কমান্ডটি বর্তমান শেল এক্সিকিউশন এনভায়রনমেন্টে মূল্যায়ন করা হবে, বর্তমান শেল এক্সিকিউশন পরিবেশের nপরিবর্তনশীল বৃদ্ধি করা হবে, তবে শেলটি একটি শিশু প্রক্রিয়াটিকে যুক্তি হিসাবে /bin/echoপ্রসারিত করে সেই আদেশটি সম্পাদন করতে বাধ্য করবে $((n += 1))

অনেকগুলি শেল একটি অপ্টিমাইজেশন প্রয়োগ করে যাতে তারা কোনও শিশু প্রক্রিয়াটিকে বাহ্যিক কমান্ডটি চালানোর জন্য চাপ দেয় না যদি এটি কোনও স্ক্রিপ্ট বা সাবশেলের শেষ কমান্ড হয় (সেই শিশুদের জন্য যেগুলি শিশু প্রক্রিয়া হিসাবে প্রয়োগ করা হয়)। ( bashতবে কেবলমাত্র যদি সেই আদেশটি সাবসেলের একমাত্র কমান্ড হয়) it

এর অর্থ কী, সেই শেলগুলির সাথে, যদি সাব-শেলের শেষ কমান্ডটি একটি বাহ্যিক আদেশ হয় তবে সাবশেল কোনও অতিরিক্ত প্রক্রিয়া তৈরি করার কারণ ঘটায় না। যদি আপনি তুলনা করেন:

a=1; /bin/echo "$a"; a=2; /bin/echo "$a"

সঙ্গে

a=1; /bin/echo "$a"; (a=2; /bin/echo "$a")

সেখানে একই সংখ্যক প্রক্রিয়া তৈরি হবে, কেবলমাত্র দ্বিতীয় ক্ষেত্রে, দ্বিতীয় কাঁটা আগে করা হয় যাতে এটি a=2একটি সাব-শেল পরিবেশে চালানো হয়।


1

Subshell

শিশু শেলকে সাবশেলও বলা হয়। সাবসেল প্যারেন্ট শেল এবং অন্য শেল থেকে তৈরি করা যেতে পারে। সাবসেল ব্যবহার করে তৈরি করা যেতে পারে:

1. প্রক্রিয়া তালিকা

একটি প্রক্রিয়া তালিকা হ'ল বন্ধনীতে আবদ্ধ কমান্ড গোষ্ঠীকরণ। উদাহরণ:

( pwd ; (echo $BASH_SUBSHELL)) 

এটি বর্তমান ওয়ার্কিং ডিরেক্টরি এবং বানানো শেলের সংখ্যা মুদ্রণ করবে। দ্রষ্টব্য সাব-শেলটি ব্যয়বহুল।

2. কপ্রোসেস

এটি ব্যাকগ্রাউন্ড মোডে একটি সাবশেল তৈরি করে এবং সেই সাবশেলের মধ্যে একটি কমান্ড কার্যকর করে।

coproc sleep 10

আপনি যদি jobsকমান্ড টাইপ করেন

[1]+  Running                 coproc COPROC sleep 10 &

আপনি পটভূমিতে ব্যাকগ্রাউন্ড প্রক্রিয়া চলমান হিসাবে ঘুম দেখতে পাবেন।

একটি শিশু প্রক্রিয়া forking

কম্পিউটিংয়ে শিশু প্রক্রিয়া হ'ল অন্য প্রক্রিয়া দ্বারা তৈরি একটি প্রক্রিয়া। যখনই কোনও বাহ্যিক কমান্ড কার্যকর করা হয় তখন একটি শিশু প্রক্রিয়া তৈরি হয়। এই ক্রিয়াটিকে কাঁটাচাষ বলা হয়।

$ps -f
UID        PID  PPID  C STIME TTY          TIME CMD  
umcr7     3647  3638  0 13:54 pts/0    00:00:00 bash
umcr7     3749  3647  0 13:59 pts/0    00:00:00 ps -f

হিসাবে ps -fবহিরাগত কমান্ড (অর্থাত বহিস্থিত কমান্ড কখনও কখনও একটি ফাইল সিস্টেম কমান্ড নামক একটি প্রোগ্রাম যা ব্যাশ শেল বাইরে বিদ্যমান।) এই ব্যাশ শেলের অভিভাবক আইডি থেকে তা কার্যকর সঙ্গে সন্তানের প্রক্রিয়া তৈরি করবে।


0

উভয় (সাবশেল এবং চাইল্ড শেল) প্যারেন্ট শেলের চেয়ে পৃথক প্রক্রিয়া (উভয়ই পিতামাতার শেলের শিশু)। অর্থাৎ তাদের ডিফেরেন্ট পিআইডি রয়েছে। এবং উভয়ই প্যারেন্ট শেলের একটি কাঁটাচামচ (অনুলিপি) দিয়ে শুরু করুন।

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

একটি শিশু শেলটি কাঁটাচামচ হিসাবে শুরু হয় তবে এটি শুরুর কনফিগারেশনের দেওয়া শেল ডিফল্ট মানগুলিতে পুনরায় সেট হয়ে যায়। এটি কিছু কোড (শেল বা কমান্ড) কার্যকর করতে ব্যবহৃত হয়।

একটি সাব শীল পরিবর্তনশীল মান অ্যাক্সেস করতে পারে:

$ x=123; ( echo "$x")
123

একটি শিশু শেল (অ-রফতানি ভেরিয়েবল) করতে পারে না:

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