Strona 1 z 1

: 13 października 2013, 14:24
autor: booyaka
Witam.

Mam za zadanie napisać aplikację operujące na procesach. Niestety nie wiem jak napisać ją samodzielnie. Laboratoria nie posiadają żadnych objaśnień, a na wykładach inny materiał.

Zadania:
  1. Proszę napisać aplikację, która uruchamia zadaną ilość procesów potomnych (ilość podajemy z klawiatury). Zależność pomiędzy rodzicem a potomkiem musi mieć poniższą strukturę:

    Kod: Zaznacz cały

    proc_m
    |
    proc_p1
    |
    proc_p2
    |
    ...
    |
    proc_pN
    Należy zwrócić uwagę, że każdy z procesów rodziców musi oczekiwać na swojego potomka. Sposób generowania informacji przez procesy potomków jest analogiczny jak w poprzednim zadaniu. Taki sam jest także sposób raportowania procesu rodzica o zakończeniu działania procesu potomka jak i sposób uruchomienia programu.
  2. Napisać program, który uruchomi proces potomny. Proces potomny ma oczekiwać na dwie liczby podane z procesu macierzystego po czym obliczy ich różnicę a wynik wyśle do procesu macierzystego. Komunikacje zorganizować przez /proc.

    proc wirtualny katalog, zawierający dane o aktualnie uruchomionych procesach proc/1 katalog z informacja o procesie nr 1; każdy proces ma w /proc podkatalog
  3. Napisz aplikację, która w procesie potomnym zabezpieczonym przed przerwaniami z poziomu terminala będzie wyświetlała na terminalu podawanym w procesie macierzystym co minutę napis: minęła minuta
Z góry dziękuję za pomoc!

Dodane:
Zrobiłem pierwszy program, wydaje mi się, że prawidłowo, ale proszę jeszcze o sprawdzenie ewentualnych błędów.

Kod: Zaznacz cały

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

void wypisz(void);

int main()
{
   int i,ilosc;
   pid_t child;
   printf("Podaj ilość procesów potomnych: \n");
   scanf ("%d",&ilosc);
   printf("Proces macierzysty:\n");
   wypisz();

   for (i = 1; i <= ilosc; i++)
   {
     child = fork();
     switch (child)
     {
       case -1:
         perror("fork error !!!");
         exit(1);
       case 0:
         printf("\nProces potomny %d: \n", i);
         wypisz();
         execl("./zad1","zad1",NULL);
      }
     wait((int)getpid());
    }
    sleep(3);
    exit(0);
 }


void wypisz(void)
{
  printf("id uzytkownika: %d\n", (int)getuid());
  printf("id grupy uzytkownika: %d\n", (int)getgid());
  printf("id procesu: %d\n", (int)getpid());
  printf("id pr macierzystego: %d\n", (int)getppid());
  printf("id grupy procesow: %d\n", (int)getpgrp());
  fflush(NULL);
}
Proszę jeszcze o wskazówki jak wykonać pozostałe dwa zadania.

: 13 października 2013, 20:27
autor: pone13
Instrukcja switch trochę mało elegancka jak na tak małą ilość opcji jakie przetwarza, napisałbym to raczej tak:

Kod: Zaznacz cały

if((child = fork()) < 0) {
perror("fork error !!!");
exit(1);
} else {
printf("\nProces potomny %d: \n", i);
wypisz();
execl("./zad1","zad1",NULL);
}
Co do 2 zadania wydaje mi się, że rozwiązanie powinno wyglądać tak:
1. Proces macierzysty tworzy plik w swoim katalogu w /proc i wpisuje tam dane do obliczeń.
2. Proces potomny otwiera ten plik i wczytuje dane, oblicza wynik i wpisuje go do pliku w swoim katalogu proc.
3. Proces macierzysty znając pid procesu potomnego i nazwę pliku z wynikiem otwiera go i odczytuje wynik.
4. Fakt modyfikacji plików zasygnalizowałbym np. poprzez wysłanie sygnału SIGUSR lub (lepiej) przez wywołanie funkcji select na deskryptorach tych plików.
O to chyba chodziło wykładowcy jeżeli chodzi o wykorzystanie /proc :) .

W 3 zadaniu rozwiązanie musisz oprzeć na blokowaniu odpowiednich sygnałów, tu masz przykład http://codingfreak.blogspot.com/2009/10 ... gnals.html