শেল কীভাবে একটি প্রোগ্রাম চালায়?


11

যদি আমি জিসিসি ব্যবহার করে একটি প্রোগ্রাম সংকলন করি এবং ব্যাশ শেল থেকে এটি চালনার চেষ্টা করি তবে এটি কার্যকর করার জন্য বাশ অনুসরণ করা পদক্ষেপগুলির সঠিক ক্রমটি কী?

আমি জানি fork(), execve(), loader, dynamic linker(এবং অন্যান্য জিনিস) জড়িত হয়, কিন্তু কেউ করতে পারেন ধাপের একটি সঠিক ক্রম এবং কিছু উপযুক্ত পড়া রেফারেন্স দেই?

সম্পাদনা:

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

(test.c স্রেফ হ্যালো ওয়ার্ল্ড প্রিন্ট করে)

$ gcc test.c -o test
$ ./test

উপরোক্ত ক্ষেত্রে ( ./test) বিশেষত কিছু শিশু প্রক্রিয়ায় ব্যাশ শুরু করার প্রোগ্রাম, লোডিং, লিঙ্কিং ইত্যাদি সম্পর্কিত কী পদক্ষেপ থাকবে ?


4
আমি আপনাকে lwn.net/Articles/630727
cuonglm

3
`স্ট্রেস বাশ-সি 'পরীক্ষা' কেন চেষ্টা করবেন না?
সের্গেই কোলোডিয়াজনি

2
দেখে মনে হচ্ছে কোনও শালীন অপারেটিং সিস্টেমের পাঠ্যপুস্তিকা ওপির জন্য ভাল উত্স হবে। এই জাতীয় স্বতন্ত্র প্রশ্ন জিজ্ঞাসা করে অপারেটিং সিস্টেমগুলি কীভাবে কাজ করে তা জানার চেষ্টা করা কোনও উত্পাদনশীল প্রক্রিয়া হওয়ার সম্ভাবনা নয়।
বার্মার

শেলের একটি ন্যূনতম উদাহরণটি দেখতে এটি দরকারী হবে: brennan.io/2015/01/16/writ-a- Shell
in-

উত্তর:


5

ঠিক আছে, যথাযথ ক্রমটি পৃথক হতে পারে, কারণ প্রকৃত প্রোগ্রামটি কার্যকর হওয়ার আগে প্রথমে শেল ওরফে বা ফাংশনটি প্রসারিত / ব্যাখ্যাযোগ্য হতে পারে এবং তারপরে কোনও যোগ্য ফাইল নাম ( /usr/libexec/foo) বনাম কিছু ডিরেক্টরি যা বিভিন্ন ডিরেক্টরিতে অনুসন্ধান করা হবে এর PATHএনভায়রনমেন্ট ভেরিয়েবল (ঠিক foo)। এছাড়াও, মৃত্যুদণ্ড বিবরণ, বিষয় জটিল হতে পারে foo | bar | zot(কিছু সংখ্যা শেল জন্য আরো কাজ করা প্রয়োজন fork(2), dup(2)অবশ্যই, এবং, pipe(2), অন্যান্য সিস্টেম কল মধ্যে), যখন ভালো কিছু exec fooঅনেক কম কাজ হিসাবে শেল নিছক নিজেই প্রতিস্থাপন নতুন প্রোগ্রাম (যেমন, এটি হয় না fork)। প্রক্রিয়া গ্রুপগুলিও গুরুত্বপূর্ণ (বিশেষত অগ্রভাগের প্রক্রিয়া গ্রুপ, সমস্ত পিআইডি যা খায়SIGINTযখন কেউ Ctrl+ C, সেশনগুলিতে ম্যাশ করা শুরু করে এবং কাজটি পটভূমিতে পরিচালিত হচ্ছে কিনা তা পর্যবেক্ষণ করা হয় (মনিটরিং করা হয় foo &) বা ব্যাকগ্রাউন্ডে উপেক্ষা করা হয় ( foo & disown)। আই / ও পুনঃনির্দেশের বিবরণগুলিও জিনিসগুলি পরিবর্তন করবে, যেমন, যদি শেল ( foo <&-) দ্বারা স্ট্যান্ডার্ড ইনপুট বন্ধ করা হয় , বা কোনও ফাইল স্টিডিন ( foo < blah) হিসাবে খোলা আছে কিনা ।

straceবা অনুরূপ এই প্রক্রিয়াটিতে করা নির্দিষ্ট সিস্টেম কল সম্পর্কে তথ্যবহুল হতে পারে এবং সেই সমস্ত কলগুলির জন্য ম্যান পেজ থাকা উচিত। স্টিভেনসের "অ্যাডভান্সড প্রোগ্রামিং ইন ইউএনএক্স এনভায়রনমেন্ট" থেকে যথাযথ সিস্টেম স্তরের পাঠ্যক্রমের কয়েকটি অধ্যায় হবে যখন একটি শেল বই (যেমন, "বাশ থেকে জেড শেল থেকে") আরও বিশদে জিনিসগুলির শেল দিকটি কভার করবে।


আমি একটি সাধারণ ক্ষেত্রে সংকীর্ণ করতে প্রশ্নটি সম্পাদনা করেছি
জেক

1

ইতিমধ্যে চলছে এমন একটি পাঠ্যপুস্তকের উদাহরণ শেল (কোড স্বচ্ছতার জন্য) ধরে নিচ্ছেন (সুতরাং ডায়নামিক লিঙ্কারটি সম্পন্ন হয়েছে), আপনি যে কমান্ডগুলি উল্লেখ করেছেন তাতে নিম্নলিখিত সিস্টেম কল করার জন্য শেলটির প্রয়োজন হবে:

  • পড়ুন: এক্ষেত্রে পরবর্তী কমান্ডটি জিসিসি পায়
  • কাঁটাচামচ: দুটি প্রক্রিয়া প্রয়োজন, আমরা ধরে নিয়েছি যে পিতামাতারা পিড 500 করেছেন এবং সন্তানের উদাহরণের জন্য।
  • পিতামাতারা ওয়েটকে কল করবেন (501), ইতিমধ্যে শিশুটি এক্সিকিউশন কল করবে। এই মুহুর্তে শেলটি পিড ৫০১ এ আর চলবে না g
  • যখন জিসিসি কলগুলি প্রস্থান করে, প্রত্যাবর্তন ফিরে আসবে, প্রম্পটটি প্রদর্শনের জন্য লিখিত বলা হয় এবং প্রক্রিয়াটি পুনরাবৃত্তি হবে।

অবশ্যই আরও জটিল কমান্ডগুলি এই বেসিক ক্রমটিতে আরও জটিলতা যুক্ত করে। বুনিয়াদী জটিলতার দুটি সহজ উদাহরণ হ'ল প্রাথমিক আইও পুনঃনির্দেশ যেখানে কাঁটাচামচ এবং এক্সিকিউট এবং ব্যাকগ্রাউন্ড প্রক্রিয়াগুলির মধ্যে একটি উন্মুক্ত, ঘনিষ্ঠ, ডুপ ক্রম সন্নিবেশ করা হয় যেখানে অপেক্ষার বিষয়টি বাদ দেওয়া হয় (এবং অন্য একটি অপেক্ষা সিগল্ড হ্যান্ডলারের সাথে যুক্ত করা হয়)।


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

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