|
C i przygotowanie programu na podstawie algorytmu
reo - 04-09-2009 10:40
Witam serdecznie, Muszę przygotować program, ale nie mam pojęcia jak go ugryźć. Będę wdzięczny za wszelką pomoc, która zbliży mnie do zakończenia tej sprawy.
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 l 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 l (po wybraniu przez użytkownika funkcji 2), za pomocą łącza nazwanego. Proces podrzędny l 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 l sygnał SIGINT. Po otrzymaniu sygnału SIGINT proces podrzędny l powinien: przesiać 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 ciastkowe powinny być zobrazowane w postaci odpowiednich komunikatów na ekranie monitora.
fnmirk - 04-09-2009 13:16
reo, pochwal się ile jest pieniędzy do podziału za ten projekt. Chętnie tu na tym forum ktoś pomoże ale nikt nie jest na tyle naiwny aby wykonać czarną robotę i nic z tego nie mieć. Jak przedstawisz fragment kodu, w którym masz błędy to ktoś pomoże rozwiązać. Całego projektu nikt za Ciebie nie napisze.
reo - 04-09-2009 13:33
Mój problem polega na tym, że muszę to zrobić na zaliczenie, a niestety nie idzie mi programowanie pod systemami Unix-owymi.
Jestem trochę załamany, bo wydaje mi się, że ów program jest trochę zbyt zaawansowany jak na zwykłe zaliczenie przedmiotu.
fnmirk - 04-09-2009 13:38
reo, odnośnie zadań postępuj podobnie. Przedstaw fragment kodu, z którym masz problem - ktoś pomoże.
Zadań też nie rozwiązujemy. To Ty dostaniesz zaliczenie i masz się czegoś nauczyć. Ty będziesz kiedyś specjalistą i będziesz musiał rozwiązywać problemy. Jeżeli brałeś udział w zajęciach to na pewno masz podstawy do napisania takiego projektu. Jeżeli obijałeś się to musisz to nadrobić.
lis6502 - 05-09-2009 00:17
W C nie kodzę, ale szczerze mówiąc (i zaglądając tu i ówdzie do wygooglanego tutka) patrząc w opis zadania widzę na przykład
Język to język. Trzeba tylko ścieżki typu C:\WINDOWS zamienić na /usr/bin i po krzyku ;) Na trzeciej stronie podręcznika systemowego opisane masz specyficzne linkusowe dyrektywy. Sprawdź na przykład man 3 stdio.
reo - 05-09-2009 19:08
W którym miejscu popełniłem błąd w poniższym kodzie? #include <pthread.h> #include <stdio.h> #include <stdlib.h>
int Wylicz_potegi(int liczba) { int wynik; wynik = liczba*liczba; printf("Wynik = %d", wynik); pthread_exit(NULL); }
int main (int argc, char *argv[]) { int tab=2; pthread_t watek_A;
pthread_create(&watek_A, NULL, Wylicz_potegi, int tab);
pthread_exit(NULL); }
killanonimx - 05-09-2009 21:59
Funkcja do pthread powinna być void* func(void* data), a nie int func(int) Po printf w wątku dodaj jeszcze fflush(0), czasami może nie wypisywać bez tego.
Edit: A na co ci pthread_exit w głównym wątku? Jak już to exit, albo najlepiej return
reo - 05-09-2009 22:25
Rzeczywiście najczęściej w różnych przykładach funkcja pthread i jej argument jest typu void. Ale niestety ja muszę przekazać do wątku argument typu int.lProces podrzędny l 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.l
killanonimx - 05-09-2009 22:44
void* = (void*)&int int = *((int*)void*)
reo - 06-09-2009 13:13
Wyjdę na idiotę, ale niestety nie wiem co ma z tym zrobić.
killanonimx - 06-09-2009 13:57
int tab=2; void* data=(void*)&tab;
W pthread_create, data wpisujesz zamiast tab. int liczba=*(int*)data;
ps: ÂŁadnie wyszedłeś ;-)
Edit: nie zauważyłem, ale w kodzie co napisałeś go kilka postów wyżej, to w tej nieszczęsnej funkcji pthread_create nie może być int tab, jak już to bez int;
reo - 06-09-2009 15:34
Teraz dla odmiany mam problem z kompilowaniem. Wpisując polecenie:
gcc watek.c -o -pthread watek
Pojawia mi się komunikat:
No such file or directory
maxdawid - 06-09-2009 16:59
A na pewno znajdujesz się w katalogu tam gdzie leżą źródła podczas wydawania tego polecenia?
reo - 06-09-2009 17:23
Tak jestem pewien. Sprawdzałem
pwd
a następnie
ls
i plik był na miejscu.
ponton - 06-09-2009 19:30
ÂŹle wywołujesz, powinno być tak:
gcc watek.c -o watek -lpthread
"-o watek" powinno być razem
biblioteki dodaje się parametrem -lnazwa
killanonimx - 07-09-2009 15:59
biblioteki dodaje się parametrem -lnazwa
dla pthread nie trzeba -lpthread
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|