در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم

6. مثال


در برنامه زیر ابتدا یک پردازه فرزند ایجاد می شود، سپس تا خاتمه فرزند wait می شود و در نهایت PID فرزند به همراه حالت خاتمه اش (به صورت دهدهی و هگزادسیمال) لیست می شود.

/* parent.c */ // parent code
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
	int pid, state;
	printf("The parent: before the fork()\n");
	if ((pid=fork()) != 0)
		wait(&state);
	else {
		execl("./child","child", NULL);
		perror("Error exec");
	}
	printf("The parent: after fork()\n");
	state = WEXITSTATUS(state);
	printf("PID child=%d; terminated with the code %d=%x\n",pid, state, state);
}
/* child.c */ // child code
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
	int pid;
	printf("The child: begins the execution \n");
	pid=getpid();
	printf("The son: %d terminates\n", pid);
	exit(10);
}

نمونه اجرای برنامه

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم


7. برنامه شماره 1


برنامه ای بنویسید که از سه دستور fork متوالی استفاده کرده و هشت پردازه ایجاد کند. با استفاده از دستورات مربوط به مشخصات پردازه ها برای هر پردازه، شماره ID و شماره ID ایجاد کننده آن را به دست آورید. درختی براساس این IDها رسم کنید که رابطه Parent-child را نشان دهد.

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
void main()
{
pid_t pid;
pid=fork();
printf("\nReturn value of fork call (0 in child proccess & pid of newly created proccess in parent proccess): %d",pid);
printf("\nProccess PID:%d",getpid());
printf("\nParent proccess PID: %d\n",getppid());

pid=fork();
printf("\nReturn value of fork call (0 in child proccess & pid of newly created proccess in parent proccess): %d",pid);
printf("\nProccess PID:%d",getpid());
printf("\nParent proccess PID: %d\n",getppid());

pid=fork();
printf("\nReturn value of fork call (0 in child proccess & pid of newly created proccess in parent proccess): %d",pid);
printf("\nProccess PID:%d",getpid());
printf("\nParent proccess PID: %d\n",getppid());
}
نمونه اجرای برنامه

همانطور که در شکل زیر نشان داده شده است، پردازه پدر قبل از اتمام اجرای فرزندان به پایان رسیده است. به همین دلیل، فرزندان یتیم شده و سیستم عامل شماره پردازه ی پدر آن ها را به 1 تنظیم می کند. برای جلوگیری از این اتفاق می توان از تابع wait استفاده کرد. در ادامه این امر نشان داده شده است.

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم

درخت پردازه ها

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم

برنامه پردازه پدر به شکلی دیگر

/* parent.c */ // parent code
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
	int pid, state;
	int i;
	for(i=0;i<3;i++)
	{
		pid=fork();
		wait(&state);
		//printf("\nfork call return value: %d",pid);
		printf("\nProccess PID:%d",getpid());
		printf("\tParent proccess PID: %d\n",getppid());
	}
}

نمونه اجرای برنامه و درخت پردازه ها

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم


8. برنامه شماره 2


برنامه ای بنویسید که از یک دستور fork و همچنین تابع wait استفاده کند. برنامه باید به گونه ای باشد که فرآیند والد از نحوه اجرای فرآیند فرزند مطلع باشد.

توضیح: این برنامه مانند مثال آورده شده در قسمت 6 می باشد. تنها با اضافه کردن ماکروی (WIFEXITED(*pstatus از اجرای موفقیت آمیز فرزند اطمینان حاصل می کنیم.

کد برنامه:

/* parent.c */ // parent code
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
	int pid, state;
	printf("The parent: before the fork()\n");
	if ((pid=fork()) != 0)
		wait(&state);
	else 
{
		execl("./child","child", NULL);
		perror("Error exec");
	}
	printf("The parent: after fork()\n");
	if(WIFEXITED(state)==1)
	{
		state = WEXITSTATUS(state);
		printf("PID child=%d; terminated successfuly with the code %d(in decimal)=%x(in hex)\n",pid, state, state);
}
}
/* child.c */ // child code
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
	int pid;
	printf("The child: begins the execution \n");
	pid=getpid();
	printf("The son: %d terminates\n", pid);
}

نمونه اجرای برنامه:

ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم


نویسنده : رامین غلامی تقی زاده

منبع : انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

#تابع_getpid #فرآیندها_در_لینوکس #دستور_kill_در_command_prompt #تابع_getppid #تابع_fork #init_چیست #zombie_process_چیست #رابطه_parent_-child
عنوان
1 ایجاد و مدیریت فرآیندها در لینوکس - قسمت اول رایگان
2 ایجاد و مدیریت فرآیندها در لینوکس - قسمت دوم رایگان
3 ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم رایگان
زمان و قیمت کل 0″ 0
1 نظر
اسماعیل بشارتی فرد

وقتی پروسس های فرزند یتیم می شن، طبق توافق انجام شده در هنگام طراحی لینوکس، پروسسinit پدر پروسس های یتیم میشه، یعنی شماره پدر پروسس های یتیم برابر 1 اعلام میشه.

اما من کد بالا رو توی اوبنتو 16.04LTS کامپایل کردم، به جای اینکه شماره پدر پروسس یتیم رو 1 اعلام کنه، 1120 اعلام می کنه که شماره پروسس upstart هست.

اونطوری که من جستجو کردم، ظاهرا Upstart جایگزین init هست.

می خواستم بپرسم که آیا این امر توجیه پذیر هست یا اینکه کار من دچار اشکال شده؟

تصویر اجرا

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....