Zadania linux, c. Fork i FIFO. Pomoc nie rozwiązania.

0

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 :)

  1. 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ć?

  1. 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?

  1. 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;
}
 
0

Poprawka do zad 2.
W koleje robię:
ls -la > fifo1
cat < fifo1

1 użytkowników online, w tym zalogowanych: 0, gości: 1