درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
رامین تقی زاده
امتیاز: 7623
رتبه:78
0
17
6
48

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

تاریخ 44 ماه قبل
نظرات 1
بازدیدها 686

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);
}
نمونه اجرای برنامه:
ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم


نویسنده : رامین غلامی تقی زاده
منبع : انجمن تخصصی فناوری اطلاعات ایران
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد
برچسب ها
ردیف عنوان
1 ایجاد و مدیریت فرآیندها در لینوکس - قسمت اول
2 ایجاد و مدیریت فرآیندها در لینوکس - قسمت دوم
3 ایجاد و مدیریت فرآیندها در لینوکس - قسمت سوم
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
  • وقتی پروسس های فرزند یتیم می شن، طبق توافق انجام شده در هنگام طراحی لینوکس، پروسسinit پدر پروسس های یتیم میشه، یعنی شماره پدر پروسس های یتیم برابر 1 اعلام میشه.
    اما من کد بالا رو توی اوبنتو 16.04LTS کامپایل کردم، به جای اینکه شماره پدر پروسس یتیم رو 1 اعلام کنه، 1120 اعلام می کنه که شماره پروسس upstart هست.
    اونطوری که من جستجو کردم، ظاهرا Upstart جایگزین init هست.
    می خواستم بپرسم که آیا این امر توجیه پذیر هست یا اینکه کار من دچار اشکال شده؟
    تصویر اجرا

برای ارسال نظر ابتدا به سایت وارد شوید