نوشتن یک پروسس در لینوکس

در یک ماشین لینوکسی Process به چه چیزی گفته میشود ؟ چگونه یک فرآیند – Process – ایجاد کنیم ، مدیریت کنیم و در انتها Process را خاتمه دهیم ؟

به هر نمونه از برنامه درحال اجرا در یک سیستم یونیکسی ( شبه یونیکسی ) یک Process گفته میشود . برای دیدن لیست Process ها در خط فرمان از دستور ps -e میتوانیم استفاده کنیم . هر Process یک Process والد دارد بجز init که با ID شماره ۱ در لیست Process ها قرار گرفته و وظیفه راه اندازی سیستم را برعهده دارد . فرآیند‌ها همواره در حال اجرا هستند ، حتی در هنگامی که ما هیچ کار خاصی با سیستم خود انجام نمیدهیم .

در لینوکس هر Process با یک ID اختصاصی شناسایی می‌شود ، که به این شماره اختصاصی معمولا pid (مخفف Process ID ) گفته می‌شود . این شناسه اختصاصی یک عدد ۱۶ بیتی است و در زمان ایجاد Process به آن اختصاص داده می‌شود . به Process والد ( Process ای که باعث به وجود آمدن Process فعلی می‌شود والد Process فعلی محسوب می‌گردد.) نیز ppid (مخفف Parend Process ID ) گفته می‌شود . در یک سیستم لینوکسی فرآیند ها – Processes – بصورت یک درخت در نظر گرفته می‌شوند که init در ریشه قرار گرفته است و هر Process بالاتر به عنوان والد Process پایین‌تر محسوب می‌شود .برای مشاهده فرآیندها به همراه فرآیند والد آنها از دستور

$  ps -e -o pid,ppid,command

استفاده می‌کنیم . سوئیچ e- باعث نمایش همه Process ها میشود و با استفاده از سوئیچ o- میتوان موارد مورد نیاز برای نمایش را ( مانند ppid و توضیحات درباره Process در حال اجرا )به مفسر shell اعلام کرد . اگر در ترمینال فعلی دستور بالا را دوباره اجرا کنیم یک شماره PID جدید به Process ما ( یعنی ps -e -o pid,ppid,command ) اختصاص می‌یابد ، اما شماره ppid همچنان بدون تغییر باقی می‌ماند . زیرا والد Process ما همین پنجره ترمینال است و باعث به وجود آمدن Process ما این پنجره ترمینال می‌باشد . پس تا وقتی از این پنجره ترمینال هر دستوری اجرا شود ppid همیشه ثابت خواهد بود .

ایجاد یک فرآیند در لینوکس

برای ایجاد یک Process در لینوکس از ۲ روش میتوانیم استفاده کنیم . در این پست روش اول توضیح داده می‌شود و ان‌شاءالله در پست بعدی روش دوم معرفی می‌گردد :

درکتابخانه استاندارد C یک تابع به اسم system وجود دارد که میتواند برنامه های موردنظر ما را در داخل برنامه در حال اجرا call کرده و خروجی را به برنامه اصلی برگرداند . روش کار بسیار ساده است ، برنامه فعلی (Process والد ) در حال اجرا یک فرآیند فرزند ایجاد میکند . فرآیند فرزند بعد از اتمام کار نتیجه را به فرایند والد برگردانده و خودش به اتمام میرسد . برای روشن شدن ماجرا برنامه ساده زیر را در نظر بگیرید :

#include<stdlib.h>

int main (){

	int return_value;
	return_value = system("ls -l ");
return return_value;
}

در این برنامه تابع system برنامه ls با سوئیچ -l را در مسیر جاری فراخوانی کرده نتیجه را در کنسول چاپ می‌کند . تابع system وضعیت اجرای فرمان در پوسته سیستم عامل را بازمیگرداند . درصورتیکه پوسته نتواند اجرا شود مقدار ۱۲۷ و اگر خطای دیگری رخ دهد مقدار ۱- بازگردانده خواهد شد .

نقص های این روش بیشتر مربوط به یکسان نبودن نوع پوسته ها و ورژن پوسته ها در سیستم های مختلف شبه یونیکسی می‌باشد. به عنوان مثال خروجی پوسته های مختلف کاملا مشابه نبوده و ممکن است در برنامه‌های پیچیده‌تر باعث اشکال در تفسیر child-process یا فرآیند فرزند شود . همچنین نقایص امنیتی نیز ایراد دیگری است که به این روش وارد است .

برای آشنایی با system میتونید از این منبع استفاده کنید .

Leave a Comment

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *