SystemyOperacyjneProgramyAll.doc

(143 KB) Pobierz
Artur Sosnówka

Podpowiedź do Makefile:

 

calc: Watek.o

              gcc -o calc Watek.o                             -lpthread

Watek.o : Watek.c

              gcc -c Watek.c                                           -lpthread

 

 

calc: klient.cpp

              g++ , klient.cpp -o calc                            -pthread

 

* * *

 

all: calc prog

CFLAGS = -g

 

prog : nazwa.o

              gcc $(CFLAGS) -o prog nazwa.o

 

nazwa.o : nazwa.c

              gcc $(CFLAGS) -c nazwa.c

 

calc: Glowny.o min.o max.o

              gcc $(CFLAGS) -o calc Glowny.o min.o max.o

 

Glowny.o : Glowny.c min.h max.h

              gcc $(CFLAGS) -c Glowny.c

min.o : min.c min.h

              gcc $(CFLAGS) -c min.c

max.o : max.c max.h

              gcc $(CFLAGS) -c max.c

 

clean:

              rm Glowny.o min.o max.o

 

 

Program #1:

Proces główny tworzy w pętli n nowych procesów. Każdy losuje liczbę u, zasypia i wreszcie zwraca kod równy wartości u. Proces główny czeka na zakończenie wszystkich procesów potomnych.

 

int main(int argc, char* argv[])

 

{

 

 

 

    if(argc!=2)

 

     {

 

     printf("Jescze raz:q\n"); return -1;

 

     }

 

 

 

int n;

 

n=atoi(argv[1]); //liczba argumentów

 

 

 

int i, z, st, in;

 

unsigned int u;

 

 

 

pid_t p[n];

 

 

 

       for(i=0; i<n; i++)

 

        {

 

     in=p[i]=fork();

 

   

 

    if(in==0)   //jeśli p[i] == 0, czyli proces nie jest rodziem...

 

     {

 

     srand( getpid() );

 

     u=(rand()%20)+1;

 

     printf("Zasnalem...\n");

 

     sleep(u);

 

     printf("\nObudzilem sie...");

 

     exit(u);

 

     }

 

        }

 

 

 

    if(in>0)   //jeśli jest

 

     {

 

      for(i=0; i<n; i++)

 

      {

 

     z=wait(&st);

 

     printf("\nProces o ID %d zakończył się jako %d. po %d sek.\n", z, i+1, WEXITSTATUS(st));

 

      }

 

     }

 

 

 

return 0;

 

}

 

 

 

Program #2:

Proces główny ma stworzyć tyle procesów

potomnych, ile jest znaków ASCII w argumentach. Każdy proces potomny zlicza ilość wystąpień zadanego mu znaku ASCII i po zliczeniu ilości zwraca tę wartość do systemu przez exit lub return. Proces macierzysty

odbiera jego status i wyświetla informacje o każdym znaku.

 

 

int main(int argc, char* argv[])

 

{

 

    if(argc<3) //ma być przynajmniej jeden argument dodatkowy

 

     {

 

     printf("Jescze raz:q\n"); return -1;

 

     }

 

 

 

      char strumien;

 

      strumien=open(argv[1],O_RDONLY);

 

 

 

int i, j, z, st, in, poz;

 

int l=0;

 

int n=argc-2;

 

char znak;

 

 

 

pid_t p[n]; //tworzymy tyle procesów, ile trzeba

 

 

 

 

       for(i=0; i<n; i++)

 

        {

 

     in=p[i]=fork();

 

     znak=(argv[i+2])[0];   //czy wymyśliłabym to, gdybym...

 

     

 

    if(in==0) //jeśli p[i] == 0, czyli proces nie jest rodzicem...

 

     {

 

     printf("\n");

 

     char *bufor = (char *) malloc (sizeof (char) * 10); //robimy 10-znakowy bufor

 

     poz=lseek(strumien, 0, SEEK_SET); //startujemy od poczštku...

 

            while(read(strumien,bufor,10)!=0)     //wczytujemy sobie do bufora 10 znaków

 

            {                                        //read COŚ zwraca i na tym się oprzemy

 

            for(j=0; j<10; j++)

 

                if(znak==bufor[j])

 

                l++;

 

    printf(".");

 

//            poz=lseek(strumien, 10, SEEK_CUR);

 

            }

 

     exit(l);

 

     }

 

        }

 

 

 

    if(in>0) //jeśli jest

 

     {

 

      for(j=0; j<n; j++)

 

      {

 

     z=wait(&st);

 

 

 

          int j;

 

          for(j=0; p[j]!=z; j++);

 

    

 

     printf("\nProces o ID %d naliczyl %d sztuk znaku \"%c\" \n", z, WEXITSTATUS(st), (argv[j+2])[0]);

 

      }

 

     }

 

 

 

return 0;

 

}

 

 

 

Program #3:

Program ma za zadanie wyświetlić zawartość wskazanego argumentem

katalogu w formacie identycznym z wywołaniem polecenia "ls  –l  –a".

(W katalogu etc są podkatalogi group i password z nazwami grup i użytkowników

odpowiadajšcym ich numerom ID.

)

 

int main(int argc, char* argv[])

 

{

 

 

 

              if(argc<2)

 

              {

 

              printf("Podaj sciezke!\n");

 

              return -1;

 

              }

 

 

 

//              time_t rawtime;

 

              struct tm * timeinfo;

 

              char buffer [80];

 

 

...

Zgłoś jeśli naruszono regulamin