$$ পিতামাতার প্রক্রিয়া হিসাবে একই আইডি ফেরত কেন?


159

বাশের সাথে আমার সমস্যা আছে, এবং আমি জানি না কেন।
শেলের নিচে, আমি লিখি:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

"গেটপিড" হ'ল একটি সি প্রোগ্রাম যা বর্তমান পিড পাওয়ার জন্য:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

যা আমাকে বিভ্রান্ত করে তা হ'ল:

  1. আমি মনে করি "(কমান্ড)" একটি উপ-প্রক্রিয়া (আমি ঠিক আছি?), এবং আমি মনে করি এটির পিডটি তার পিতামাতার পিডের সাথে আলাদা হওয়া উচিত, তবে তারা একই, কেন ...
  2. আমি যখন প্রথম প্রোগ্রামটি প্রথম বন্ধনীগুলির মধ্যে পিড দেখানোর জন্য ব্যবহার করি তখন এটি যে পিড দেখায় তা অন্যরকম হয়, তাই না?
  3. '$$' ম্যাক্রোর মতো কিছু?

আপনি কি আমাকে সাহায্য করতে পারেন?


8
দ্রষ্টব্য যে getpidএটি কোনও সাবসিলে চালিত না হলেও একটি পৃথক প্রক্রিয়া আইডি দেখায়।
চ্যানার

1
@ মারিয়ান echo $$ $BASHPID ; ( echo $$ $BASHPID )দেখায় যে এটি করে। গোলাকার বন্ধনী একটি সাব-শেল তৈরি করে। বিবৃতিগুলি পরিবর্তনশীল মানগুলি পরিবর্তন করতে পারে এবং প্যারেন্ট শেল অবশ্যই সেই পরিবর্তনগুলি দেখতে পাবে না। এটি একটি fork()অপারেশন হিসাবে প্রয়োগ করা হয়।
বেন

উত্তর:


222

$$একটি সাব-শেলের মধ্যে পিতামাতার প্রসেস আইডি ফিরিয়ে দিতে সংজ্ঞায়িত করা হয়; "বিশেষ পরামিতি" এর অধীনে ম্যান পৃষ্ঠা থেকে:

The শেলটির প্রসেস আইডিতে প্রসারিত হয়। একটি () সাবশেলে এটি বর্তমান শেলের প্রসেস আইডিতে প্রসারিত হয়, সাব-শেল নয়।

ইন bash4, আপনার সাথে সন্তানের প্রক্রিয়া আইডি পেতে পারেন BASHPID

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634

16
"পিতামাতা" কিছুটা বিভ্রান্তিমূলক (কমপক্ষে এটি আমার কাছে ছিল), এটি আসলে "শীর্ষ স্তরের" শেল। উদাহরণস্বরূপ: echo $$; (echo $$; (echo $$))একই
পিডটি

1
রাইট; আমার বলা উচিত ছিল যে মানটি প্যারেন্ট শেল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় (যা তার পিতামাতার কাছ থেকে এর মান উত্তরাধিকার সূত্রে প্রাপ্ত হয় )। শীর্ষ স্তরের শেল এটির (নন-শেল) প্যারেন্ট প্রক্রিয়া থেকে উত্তরাধিকার সূত্রে প্রাথমিকভাবে সেট করে।
চিপনার

$ Expands to the process ID of the shellএটা কি না? echo $শুধু আক্ষরিক প্রতিধ্বনি $
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস ভাল, হ্যাঁ; $একা প্যারামিটার সম্প্রসারণ নয়। ম্যান পৃষ্ঠাটি বিশেষ প্যারামিটারের নাম উল্লেখ করছে , যা $; এটি $একাকী প্রসারিত হওয়ার দাবি করে না।
চ্যানার

ঠিক আছে, আমি এর echo $BASHPIDসত্যতা কি তা জানিনা, তবে ব্যাশ 4 এবং 5 এ কাজ করে (তবে ম্যাকোজে 3.2.57 সংস্করণ নয়)
আলেকজান্ডার মিলস

81

আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন।

  • $! সর্বশেষ ব্যাকগ্রাউন্ড প্রক্রিয়াটির পিআইডি।
  • kill -0 $PID এটি এখনও চলছে কিনা তা পরীক্ষা করে দেখুন।
  • $$ বর্তমান শেলের পিআইডি।

2
দ্বিতীয় বুলেটটি কি হওয়া উচিত নয় kill -0 $!যদি আমরা পটভূমি প্রক্রিয়াগুলির বিষয়ে কথা বলি? PIDডিফল্ট হিসাবে কিছু সেট করা হয় না।
আইজাক ফ্রিম্যান

26
  1. প্যারেন্টিহেস বাশ-এ সাবস্কেল প্রার্থনা করে । যেহেতু এটি কেবলমাত্র একটি সাবশেল এটির একই পিআইডি থাকতে পারে - এটি বাস্তবায়নের উপর নির্ভর করে।
  2. আপনি যে সি প্রোগ্রামটি আহ্বান করছেন তা একটি পৃথক প্রক্রিয়া, যার নিজস্ব অনন্য পিআইডি রয়েছে - এটি সাব-শেলের মধ্যে রয়েছে কিনা তা বিবেচ্য নয়।
  3. $$বর্তমান স্ক্রিপ্ট পিআইডি- তে বাশের একটি উপনাম । এর মধ্যে $$এবং $BASHPIDএখানে পার্থক্যগুলি দেখুন এবং$BASH_SUBSHELL নীচে নীড়ের স্তর রয়েছে এমন অতিরিক্ত ভেরিয়েবলের উপরে ।

4

আপনি getppid()যদি নিজের সি প্রোগ্রামটি আপনার শেলের পিআইডি মুদ্রণ করতে চান তবে চেষ্টা করুন ।


2

আপনি যদি কোনও পরিচিত কমান্ডের পিআইডি কীভাবে পাবেন তা জিজ্ঞাসা করলে এটি এর মতো কিছু হতে পারে:

আপনি যদি # কমান্ডটি নীচে জারি করে থাকেন তবে জারি করা আদেশটি ছিল ***

ডিডি যদি = / দেব / ডিস্কেক্সের = / দেব / ডিস্কি


তারপরে আপনি ব্যবহার করবেন:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

এখানে যা ঘটে তা হ'ল এটি ক্ষেত্রের সমস্ত প্রয়োজনীয় অনন্য অক্ষর পাইপগুলি ব্যবহার করে এবং সেই ক্ষেত্রটি ব্যবহার করে প্রতিধ্বনিত করা যায়

প্রতিধ্বনি $ পিআইডি


1

সঠিক পিড পাওয়ার জন্য এটি এক উদাসীন উপায়

pid=$(cut -d' ' -f4 < /proc/self/stat)

সাব জন্য একই কাজ

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

আউটপুট পরীক্ষা করুন

pid = 8099
8099 != 8100

ভাল ধারণা, কিন্তু আপনি কি কাঁটাচামচ এর পিড পাবেন না কাটা আউটপুট ক্যাপচার চালানো? যদি আমি এটি দুবার চালিত করি, একবার প্রতিধ্বনি $ (...) দিয়ে এবং একবার ছাড়া, তবে আমি বিভিন্ন উত্তর পেয়েছি।
মার্টিন ডরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.