Facebook
From Reliable Finch, 7 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 259
  1. 1. Przed pętlą, w której się forkujesz powinieneś zablokować sygnał SIGCHLD i odblokowujesz go dopiero po wyjściu z while, czekające na procesy, a ten while ma wyglądać w następujący spoób:
  2.  if(ifBack == 0){
  3.             while(chCounter){
  4.               sigsuspend(&mask);
  5.             }
  6.         }
  7. gdzie ifBack oznacza czy działay w backgroundzie czy też nie.
  8.  
  9. 2. Blokujące sycall mogą być przerywane sygnałami dlatego trzeba je wznowić.
  10. 3. Musisz napisać handler, mniej więcej tak:
  11. void handler(int sig_nb){
  12.     //write(1, "jestem handler\n", 15);
  13.     pid_t ch = (pid_t)1;
  14.     int c;
  15.     //printf("%d\n",sig_nb);
  16.     int* stat;
  17.     while(ch > 0){
  18.         int *res;
  19.         ch = waitpid(-1, NULL, WNOHANG);
  20.     //    printf("%d\n", ch);
  21.         if(ch > 0){
  22.             if(ifInForeground(ch))
  23.                 chCounter--;
  24.             else{
  25.                  sprawdz z jakim kodem się zakończył oraz dopisz do structury rezultatów wynik.
  26.             }
  27.         }
  28.     }
  29. }
  30.  
  31.  
  32. Ta struktura wyników ma mieć stały rozmiar i jeżeli już więcej danych się do niej nie zmieści to się nie musisz przejmować i nie dopisywać więcej.
  33. 4. Jeszcze coś z tym SIGINT'em trzeba zrobić i chyba zablokować go w mshellu a odblokować u dzieci, które są w foregroundzie. Plus dzieciom z backgroundu zakładasz nowy ród: setsid(), żeby sigint ich nie zabił