ایجاد یک فرایند با استفاده از تابع fork

قبلا با نوشتن یک فرآیند -Process- ابتدایی در لینوکس به وسیله تابع system کمی آشنا شدیم . اما همانطور که گفتم روش اصولی استفاده از تابع fork و ساخت یک فرآیند فرزند -child Process- و تغییر این فرآیند جدید طبق نیازمون هست .
در برنامه نویسی سیستمی ویندوز (win32) از توابع از پیش نوشته شده ای مثل CreateProcess برای ساخت یک process جدید استفاده میشود . در لینوکس این تابع در دسترس نیست ولی توابع fork و exec کار مشابهی را برای ما انجام میدهند .
تابع fork
با استفاده از فراخوانی تابع fork لینوکس یک فرآیند فرزند کاملا مشابه فرآیند والد -parent Process- ایجاد میکند . فرآیند فرزند با اینکه کاملا مشابه والد خود است اما در فضای حافظه متفاوتی اجرا می‌شود و بعد از فراخوانی تابع fork مسیر متفاوتی نسبت به والد خود طی می‌کند . با توجه به این موضوع که فرآیند فرزند یک فرآیند جدید است ، شناسه متفاوتی با فرآیند والد خود دارد و با توجه به همین موضوع می‌توان تشخیص داد فرآیندی که در حال اجراست فرآیند فرزند است یا فرآیند والد . مقدار بازگشتی تابع fork در فرآیند والد برابر با شناسه فرآیند فرزند است ولی این مقدار در فرآیند فرزند برابر با عدد ۰ است . با چک کردن این عدد ( مقدار بازگشتی تابع fork ) به راحتی میتوان تشخیص داد فرآیند در حال اجرا فرآیند والد است یا فرزند .

در برنامه زیر در صورتیکه فرآیند فرزند در حال اجرا باشد شرط if صحیح است و دستورات بلاک بالا اجرا می‌شوند و در‌صورتیکه فرآیند والد در حال اجرا باشد شرط if صحیح نیست و بلاک مربوط به else اجرا می‌شود . فرآیند فرزند ۱۰ مرتیه و فرآیند والد ۲۰ مرتبه اجرا می‌شوند و هر کدام بعد از هربار اجرا به مدت ۱ ثانیه تاخیر ایجاد می‌کنند :

#include <stdio.h>;
#include <sys/types.h>;
#include <unistd.h>;

int main ()
{
pid_t child_pid;
int count1 , count2;

printf ("the main process id before fork ,  is %d\n" , (int) getpid());
child_pid = fork ();

	if (child_pid == 0 )
	{
		printf ("this is the child Process with id %d\n" , (int) getpid());
		while(count1 < 10)
		{
			printf("child Process : %d\n" , count1 );
			sleep (1);
			count1++;
		}
	}
	else
	{
		printf ("this is parent Process with id %d\n" , (int) getpid());
		while (count2 < 20)
		{
			printf ("Parent Process : %d\n" , count2 );
			sleep (1);
			count2++;
		}
	}
return 0 ;
}

در سایت دانشگاه واترلو یک مثال ابتدایی ( شبیه به همین چیزی که من نوشتم ) از توابع fork وexec وجود داره .

Leave a Comment

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