C i przygotowanie programu na podstawie algorytmu

Potrzebujesz pomocy z C, C++, perl, python, itp.
reo
Posty: 7
Rejestracja: 04 września 2009, 10:20

C i przygotowanie programu na podstawie algorytmu

Post autor: reo »

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
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

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
Posty: 7
Rejestracja: 04 września 2009, 10:20

Post autor: reo »

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
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

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ć.
Awatar użytkownika
lis6502
Member
Posty: 1798
Rejestracja: 05 listopada 2008, 20:14
Lokalizacja: Miasto Szybowców

Post autor: lis6502 »

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
Dane wprowadzone przez użytkownika scanf ("%d", &a)
nie idzie mi programowanie pod systemami Unix-owymi
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
Posty: 7
Rejestracja: 04 września 2009, 10:20

Post autor: reo »

W którym miejscu popełniłem błąd w poniższym kodzie?

Kod: Zaznacz cały

#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
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

Post autor: killanonimx »

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
Posty: 7
Rejestracja: 04 września 2009, 10:20

Post autor: reo »

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.
  • 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.
killanonimx
Beginner
Posty: 113
Rejestracja: 11 września 2008, 15:48

Post autor: killanonimx »

Kod: Zaznacz cały

void* = (void*)&int
int = *((int*)void*)
reo
Posty: 7
Rejestracja: 04 września 2009, 10:20

Post autor: reo »

Wyjdę na idiotę, ale niestety nie wiem co ma z tym zrobić.
ODPOWIEDZ