تا %60 تخفیف خرید برای 7 نفر با صدور مدرک فقط تا
00 00 00

آموزش ایجاد و مدیریت فرآیندها ( Process ) در لینوکس قسمت 3

رامین تقی زاده
رامین تقی زاده
1 پسند
1095 بازدید
1 نظر
64 ماه قبل

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 نظر