Mam do wykonania kilka zadań z C na linuxie. Natknąłem się na kilka problemów. Wszystkie zadania muszą być na systemie linux i za pomocą C. Jedno jest bez C :)
- Utworzyć drzewo procesów za pomocą fork() w C. Drzewo ma wyglądać tak:
PID A
_
\
PID B
_
\
PID C
_
\
PID D
Każdy proces uśpi się na 10 sekund a następnie zakończy. Proces główny poczeka na zakończenie procesów.
Zrobiłem coś takiego:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
int secInMil = 1000;
if(fork()) { // A
printf("%d\n", (int)getpid());
sleep(10 * secInMil);
if(fork()) { // B
printf("\t%d\n", (int)getpid());
sleep(10 * secInMil);
}
}
else {
if(fork()) { // C
printf("\t\t%d\n", (int)getpid());
sleep(10 * secInMil);
if(fork()) { // D
printf("\t\t\t%d", (int)getpid());
sleep(10 * secInMil);
}
}
else { // ??
}
}
wait();
return 0;
}
I szczerze powiedziawszy nie wiem czy to jest dobrze. W konsoli numery procesów są odpowiednio kolejne ale czasami wyświetla się to drzewo krzywo ;D No i sam fakt czy samo drzewo jest dobrze zbudowane?
Ma być tak, że każdy kolejny ma być synem prawym synem poprzedniego.
Mógłby ktoś porządnie to wytłumaczyć?
- To najważniejsze zadanie polega by wysłać rozwiązania zapakowane w tar.gz. za pomocą FIFO do katalogu prowadzącego. Z innego kompa. Tzn wszystkie są podpięte pod tę samą sieć i jest przejście. On u siebie ma coś takiego:
/home/..../public_html/mójnumberstudenta.fifo
Więc utworzyłem u siebie coś podobnego i chcę przesłać do innego folderu.
Tak więc w folderze z rozwiązaniem:
cat rozwiązania.tar.gz > ścieżkaDoFifo
No ale to nie przechodzi.
Zrobiłem coś takiego, że mam dwa terminale i w jednym:
cat ls -la > fifo1
A w drugim:
cat < fifo1
No i to działa. Po uruchomieniu tego w drugim terminalu pojawia się wynik ls -la z terminala pierwszego.
Tak więc co robię źle z archiwum?
- Napisać program który uruchomi 2 procesy(fork) proces rodzica będzie czytać z klawiatury i zapisywać do pliku(każdy zapis napisuje plik) a proces potomny będzie odczytywać i obliczał kwadraty i kasował plik.
No mam zrobione. Ale jest jeszcze "spraw aby w każdym momencie tylko jeden proces miał dostęp do pliku.
Tutaj nieco szukałem o sekcjach krytycznych ale nic nie działało. Pracuje w C# więc szukałem jakiegoś locka ;D
#include <stdio.h>
main() {
if(fork()) {
FILE *fp;
fp = fopen("zad3.txt", "w+");
int number;
scanf("%d", &number);
fprintf(fp, "%d", number);
fclose(fp);
if(fork()) {
FILE *fpa;
fpa = fopen("zad3.txt", "r");
int number2 = 0;
fscanf(fpa, "%d", &number2);
printf("%d", number2 * number2);
fclose(fpa);
remove("zad3.txt");
}
}
return 0;
}