FAQ | Points | Add... | Recent posts | Search | Register | Log in


C++ zadanie do napisania pod Linux. 400pkt Nagrody


Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> C++ zadanie do napisania pod Linux. 400pkt Nagrody
Author
Message
Guest
Poziom 26
Poziom 26





Post#1 Post from the author of the topic 16 Jun 2008 16:59   

C++ zadanie do napisania pod Linux. 400pkt Nagrody


Witam jak w temacie, kolega poprosił mnie o napisanie zadania, które ma na jutro do wykonania. Podchodzę do niego już n-ty raz, ale dalej nie mam pomysłu jak to rozwiązać. Dodam tylko, że programowałem w VB , Pascal ale z C++ większej styczności nie miałem.
Jeśli ktoś ma jakieś sugestie, rady lub chce pomóc to serdecznie z góry dziękuje, oto treść zadania:
Code:

Hierarchia procesów:
Treść zadania
Opracować program (patrz rysunek powyŜej – proces główny), który utworzy dwa procesy
potomne, w których uruchomione zostaną kolejne programy (patrz rysunek powyŜej – proces
podrzędny 1 oraz proces podrzędny 2) poprzez wywołanie funkcji exec. Procesy podrzędne
powołają po jednym wątku, które będą realizować obliczenia. UŜytkownik ma mieć
moŜliwość z poziomu procesu głównego wykonania następujących funkcji:
1. wprowadzenie wartości całkowitych (w przedziale od dwóch do czterech wartości);
2. zlecenie wykonania operacji wyliczenia sumy kwadratów, wprowadzonych w punkcie
pierwszym;
3. zakończenia działania obu programów.
Dane wprowadzone przez uŜytkownika (po wybraniu przez niego funkcji 1)
przekazywane są z procesu głównego do procesu podrzędnego 1 (po wybraniu przez
uŜytkownika funkcji 2), za pomocą łącza nazwanego. Proces podrzędny 1 po otrzymaniu
danych powinien je przesłać, za pomocą łącza nienazwanego, do wątku A, który wyliczy
potęgi dwójkowe poszczególnych wartości. Wątek A wyniki obliczeń przekazuje za pomocą
łącza nazwanego do wątku B, który wyliczy ich sumę. Po wyliczeniu sumy, wątek B
przekazuje wynik przez łącze nazwane do procesu podrzędnego 2, który przekazuje go
poprzez łącze nienazwane do procesu głównego w celu wyświetlenia na ekranie terminala.
Proces główny kończy swoje działanie po wybraniu przez uŜytkownika funkcji 3
przesyłając jednocześnie do procesu podrzędnego 1 sygnał SIGINT. Po otrzymaniu sygnału
SIGINT proces podrzędny 1 powinien: przesłać do procesu podrzędnego 2 sygnał
SIGUSR1, wymusić zakończenie wątku A i następnie zakończyć swoje działanie. Po
otrzymaniu sygnału SIGUSR1 proces podrzędny 2 powinien wymusić zakończenie wątku B i
następnie zakończyć swoje działanie.
UŜytkownik powinien mieć moŜliwość wykonywania operacji w pętli dopóki nie
wybierze funkcji 3.
Poszczególne operacje cząstkowe powinny być zobrazowane w postaci odpowiednich
komunikatów na ekranie monitora.


UWAGI!
1. Działanie programu odbiegające od przedstawionych wcześniej załoŜeń
dyskwalifikuje je.
2. Utworzony program powinien mieć wprowadzone komentarze, opisujące znaczenie danej
linii kodu w aspekcie realizowanego zadania. Brak komentarzy powoduje obniŜenie liczby
punktów o 4 za całość zadania. Na początku programu naleŜy podać nagłówek, w którym
powinny być zawarte dane osoby, która program opracowała. Program jest jednocześnie
sprawozdaniem z realizacji zadania. Jego czytelność będzie równieŜ brana pod
uwagę.
3. Realizowane zadania są projektami autorskimi. Jakakolwiek zbieŜność pomiędzy
dwoma dostarczonymi programami dyskwalifikuje je.

Oraz załączony schemat:
C++ zadanie do napisania pod Linux. 400pkt Nagrody

Za udzielenie pomocy w rozwiązaniu tego problemu przeznaczam nagrodę
w wysokości 400 punktów, którą rozdysponuje pomiędzy pomagających.


Z tego co się doczytałem w tych materiałach:
http://students.mimuw.edu.pl/SO/Linux/Temat03/lacza.html
Oraz biorąc pod uwagę schemat, należy wykonać ten program na łączach oznaczonych i nieoznaczonych.
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 16 Jun 2008 16:59   





Back to top
   
Stefan_2000
Poziom 13
Poziom 13


Joined: 10 Sep 2003
Posts: 119
Location: Łódź

Post#2 16 Jun 2008 18:56helpful post - solution   

Re: C++ zadanie do napisania pod Linux. 400pkt Nagrody


Witam,

przesyłanie sygnałów między procesami w Linuxie jest proste, o tworzeniu łącz nazwanych i nie, nie mam zbyt dużej wiedzy, ale myślę, że to jest dobty moment, żeby ją uzupełnić :-)

BTW.
Co to za uczelnia ma takie fajne, nietrywialne zadania?
I jak ma się punkt 3 do regulaminu elektrody?

pozdrawiam i zabieram się do pisania
stefan
Back to top
   
Guest
Poziom 26
Poziom 26





Post#3 Post from the author of the topic 16 Jun 2008 19:03   

Re: C++ zadanie do napisania pod Linux. 400pkt Nagrody


Witam uczelnia to WSTI - Wyższa Szkoła Technologii Informatycznych w Warszawie.

Nie mogę się o niej bliżej wypowiedzieć, ponieważ ja uczęszczam do innej uczelni i na inny kierunek.
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 16 Jun 2008 19:03   





Back to top
   
Stefan_2000
Poziom 13
Poziom 13


Joined: 10 Sep 2003
Posts: 119
Location: Łódź

Post#4 16 Jun 2008 22:30helpful post - solution   

Re: C++ zadanie do napisania pod Linux. 400pkt Nagrody


Chwilkę się tym pobawiłem i tak teraz do mnie dotarło, że nie trafiam w warunki zadania :/


main.cpp
Code:

#include <cstdio>
#include <cstdlib>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <cstring>
#include <fcntl.h>


// PID potomkow
pid_t child1;
pid_t child2;

// deskryptory potoku nienazwanego
int pdesc[2];

// nazwa kolejki
static const char* FIFO_NAME = "./fifo1";

// glowny
int main() {
   // tworzymy kolejke
   mkfifo( FIFO_NAME, S_IRUSR | S_IWUSR);

   // tworzymy potok nienazwany
   pipe( pdesc );
   
   // rozwidlamy sie
   child1 = fork();
   if (child1 < 0) {
      fprintf( stderr,"Nie udalo sie rozwidelcowac\n");
      exit( 1 );
   } else if (child1 == 0) {
      // process potomny
      close( pdesc[0] ); // zamykamy koniec potoku do czytania
      // bufor potrzebny na przekazanie deskryptora potoku
      char buf[20] = {0};
      sprintf( buf, "%d", pdesc[1] );
      // parametry wywolania: najpierw jest nazwa binarkim pote, lista argumentow:
      // - zgodnie z konwencja pierwszy parametr to nazwa pliku wykonywalnego
      // - nazwa kolejki z ktorej ma czytac
      // - deskryptor konca potoku zwiazany z pisaniem
      execl( "./child1", "child1", FIFO_NAME, buf, (char *) NULL);
      // exec nigdy w normalnych warunkach nie wraca
      fprintf( stderr,  "Blad wywolania exec\n" );
      exit( 1 );
   } else {
      // proce macierzysty
      
      // bedziemy sie znowu rozwidlac
      child2 = fork();
      if (child2 < 0) {
         fprintf( stderr,"Nie udalo sie ponownie rozwidelcowac\n");
         exit( 1 );
      } else if (child2 == 0) {
         // process potomny 2
         close( pdesc[1] ); // zamykamy koniec potoku do pisania
         // bufor potrzebny na przekazanie deskryptora potoku
         char buf[20] = {0};
         sprintf( buf, "%d", pdesc[0] );
         // parametry wywolania: najpierw jest nazwa binarki, potem lista argumentow:
         // - nazwa pliku wykonywalnego
         // - deskryptor konca potoku zwiazany z czytaniem
         execl( "./child2", "child2", buf, (char *) NULL);
         // exec nigdy w normalnych warunkach nie wraca
         fprintf( stderr,  "Blad wywolania exec po raz drugi\n" );
      
      } else {

         // otwarcie fifo bedzie wisiec az watek potomny otworzy fifo do czytania
         FILE* fifo = fopen(FIFO_NAME, "w");
         printf( "macierzysty\n" );
         fputs( "12345\n", fifo);
         fclose( fifo );
         printf( "koniec\n" );
         sleep(3);

         // mordujemy w±tki potomne
         kill(child1, SIGUSR1);
         kill(child2, SIGUSR1);
      }   
   }


}





child1.cpp
Code:

#include <cstdio>
#include <cstdlib>
#include <string>
#include <fcntl.h>


using namespace std;

// child 1
int main( int argc, char* argv[]) {

   // przechwytujemy argumenty wywolania
   char* fifoName = argv[1];
   char* pDescName = argv[2];
   int pDesc = atoi( pDescName );

   // otwieramy potok do czyanie
   FILE* fifo = fopen( fifoName, "r");
   char buf[20]= {0};
   
   fgets( buf, 20, fifo);
   printf( "Odebralem: %s", buf);
   fclose( fifo );

   write( pDesc, buf, strlen(buf) );
   close( pDesc );
   
}




child2.cpp
Code:

#include <cstdio>
#include <cstdlib>
#include <string>
#include <fcntl.h>


using namespace std;

// child 2
int main( int argc, char* argv[]) {

   // przechwytujemy argumenty wywolania
   char* pDescName = argv[1];
   int pDesc = atoi( pDescName );

   char buf[20]= {0};
   
   read( pDesc,buf, 20);
   printf( "Odebralem z pDesc: %s", buf);
   
}




Pomijam kwestię wysyłania sygnałów, bo to akurat nie jest teraz istotne, to nie łapę co to wg autorów zadania jest proces, a co wątek. Punkt wyjścia do dyskusji jest, teraz proszę o podpowiedź jak to powinno wyglądać na prawdę :-)

Co to znaczy "potęgi dwójkowe poszczególnych wartości"?
Back to top
   
Google

Google Adsense


Post# 16 Jun 2008 22:30helpful post - solution   





Back to top
   
Guest
Poziom 26
Poziom 26





Post#5 Post from the author of the topic 16 Jun 2008 23:13   

Re: C++ zadanie do napisania pod Linux. 400pkt Nagrody


Quote:
Co to znaczy "potęgi dwójkowe poszczególnych wartości"?


W tym przypadku jak widizmy jet to podniesienie każdej z tych liczb do potęgi 2, czyli np: liczba 2 podniesiona do poŧęgi na 4, liczba 3 da 9 itd.
Back to top
   
smagciu
Poziom 12
Poziom 12


Joined: 18 Nov 2005
Posts: 82
Location: warszawa

Post#6 17 Jun 2008 19:42   

Re: C++ zadanie do napisania pod Linux. 400pkt Nagrody


procesy tworzysz przez fork albo exec, a watki przez pthread tylko jak sie kompiluje program pod konsola to trzeba jeszcze dodac - pthread (nie wiem czy dobrze pamieta). Kiedyś właśnie pisałem nietrywialny program 4 procesowy i jak pamiętam to tych sygnałów to nie lubiłem, jakoś rozjeżdżały mi sie te procesy na początku, ale nie ważne.
Proces posiada własną przestrzeń adresową,wątki mają wspólną sekcję danych - tak jes na wikipedii ale lepiej jest chyba powiedzieć, że proces ma przydzielony odrębny obszar pamięci komputera. Wątki wykonywane są współbieżnie w obrębie tego samego obszaru pamięci.
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> C++ zadanie do napisania pod Linux. 400pkt Nagrody
Page 1 of 1
Similar topics
Edycja kodu źródłowego apikacji pod Linux. (11)
Pisanie sterownika USB pod system linux. (9)
Sterownik na USB pod Windows lub Linux. (5)
STK200/300 program pod DOS / Linux (2)
Programowanie ATA pod systamem Linux (3)
[at91sam9260][linux/c] Kamera pod openwrt (5)
Jak zrealizować zadanie pod 8051???? (5)
BASCOM pod Linux ??? (9)
Avr pod linux oraz obawa o sprzęt (7)
[delphi] działanie programu pod linux (wine) (1)

Page generation time: 0.097 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed