الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اريد علاقة بين exit and wait؟

بدأه نادين01 في 2 نوفمبر 2014 · 2 رد · 750 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد علاقة بين exit and wait

بحيث يقوم processus pere  بعرض 20 رقم

ثم processus fils  بعرض 20 رقم التالية

ويعدها يكمل pere الاعداد المتبقية في الملف

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>

int main(void){

  int i,j ;


  printf("Je suis le processus  %d\n",getpid()) ;
  
  printf("Je vais afficher 20  premiers nombres Pere \n");
  
   FILE *po = fopen("nombre","r") ;
   if (po==NULL){ 
     perror("Impossible ") ;
     return -1 ;
   }

   
   for(j=0;j<20;j++){
     fscanf(po,"%d",&i) ;
     printf("%d\n",i) ;
   }
   
   printf("La Creation du fils \n") ;
   
   switch(fork()){
   case -1:perror("impossible de creer un fils") ;
     exit(-1) ;
   
   case 0:	
     	printf("Je suis le processus fils %d\n",getpid()) ;
        printf("Je vais afficher 20 nombres premiers fils \n");
     
     for(j=0;j<20;j++){
	printf("Je suis le processus%d ",getpid());
       fscanf(po,"%d",&i) ;
       printf("%d\n",i);
     }
	
     fclose(po) ;
     printf("Le fils mort \n") ;
     exit(0);
	
   default:
	
   	printf("Le pere termine la lecture\n") ;
   
   
   while(!feof(po)){
	printf("Je suis le processus%d ",getpid());
     fscanf(po,"%d",&i) ;
     printf("%d\n",i) ;
   }
  
   fclose(po) ;
    
  
 } 
 
return 0;
}
#2

wait تجعل العملية الأم تتوقف وتنتظر حتى تتغير حالة العملية الإبنه (تتوقف، أو تنتهي، أو تنهار وغيرها من الحالات)، سبب تغير حالة العملية الإبنه سيمرر عبر المتغير status الذي تمررينه لـwait (يمكن تمرير NULL إذا كان لايهم السبب).

 

يمكنك استخدامها لجعل العملية الأم تنتظر حتى تنتهي العملية الإبنه باستخدام exit() كما في المثال (WIFEXITED للتأكد من أنها خرجت طبيعياً):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int
main(void)
{
  int status;
  printf("P(%ld)\n", (long)getpid());

  /* إنشاء تفرع */
  switch(fork()) {
    /* فشل الإستدعاء */
    case -1:
      perror("Error");
      return -1;
    case 0:
      /* العملية الابنة */
      printf("C(%ld)\n", (long)getpid());
      sleep(3);
      exit(123);
  }

  /* ننتظر انتهاء الإبنة قبل استمرار العملية الأم */
  wait(&status);

  if(WIFEXITED(status)) {
    printf("Child process terminated with exit status %d\n",
      WEXITSTATUS(status));
  } else {
    printf("Child status changed, unknown status %d\n", status);
  }

  printf("P(%ld)\n", (long)getpid());

  return 0;
}
$ gcc -Wall -Wextra -pedantic -ansi file.c -o file
$ ./file
P(2926)
C(2927)
# بعد ثلاثة ثواني
Child process terminated with exit status 123
P(2926)
$

في المثال الذي وضعتيه فأنتي تستخدمين fopen/fscanf وغيرها، دوال القراءة والكتابة في سي buffered، أي أنها تكتب وتقرأ "جزء كبير" من الملف للذاكرة، عند القراءة فتعطيك تلك البيانات التي سبق قراءتها وخزنتها في الذاكرة، وعند الكتابة فتكتب في الذاكرة ثم إذا وصل حجم البيانات حد معين أو استدعيتي fflush أو exit فتكتبه على القرص (لتقليل القراءة والكتابة المباشرة للقرص حيث أنه بطيئ).

 

هذا التصرف قد لايجعل البرنامج يتصرف كما تريدين، لن تكمل العملية الأم من حيث انتهت الإبنة في القراءة، لا أعرف إن كان هناك حل لها مع fork.

تم تعديل هذه المشاركة بواسطة Mr.B في 4 نوفمبر 2014 في 21:23

#3

*** مشاركة مكررة، يرجى حذفها. ***

تم تعديل هذه المشاركة بواسطة Mr.B في 4 نوفمبر 2014 في 21:26

مواضيع مشابهة