| Author |
Message
|
Guest Poziom 26

|
#1
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:
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

|
#
16 Jun 2008 16:59 |
|
|
|
|
|
| Back to top |
|
 |
Stefan_2000 Poziom 13

Joined: 10 Sep 2003 Posts: 119 Location: Łódź
|
#2
16 Jun 2008 18:56 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

|
#3
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

|
#
16 Jun 2008 19:03 |
|
|
|
|
|
| Back to top |
|
 |
Stefan_2000 Poziom 13

Joined: 10 Sep 2003 Posts: 119 Location: Łódź
|
#4
16 Jun 2008 22:30 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

|
#
16 Jun 2008 22:30 |
|
|
|
|
|
| Back to top |
|
 |
Guest Poziom 26

|
#5
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

Joined: 18 Nov 2005 Posts: 82 Location: warszawa
|
#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 |
|
 |