/* Klient oparty na kolejkach komunikatow dla serwera wspolbieznego. */ #include #include #include #include #include #include #include typedef struct mymesg1 { long mtype; pid_t pid; } paczka1; typedef struct mymesg2 { long mtype; double melement; } paczka2; int main(int argc, char *argv[]) { int f, f1; key_t klucz_kolejka; char *sciezka; int czy_czekac = 0, liczba_sekund; pid_t pid = getpid(); const size_t wielkosc1 = sizeof(paczka1) - sizeof(long); if (argc > 1) { czy_czekac = 1; liczba_sekund = strtol(argv[1], NULL, 10); } if (argc > 2) { sciezka = strndup(argv[2], strlen(argv[2])); } else { sciezka = strndup("/tmp/roboczy.kolejka_serwer", strlen("/tmp/roboczy.kolejka_serwer")); } klucz_kolejka = ftok(sciezka, 0); f = msgget(klucz_kolejka, 0600); paczka1 *wiad = (paczka1 *)malloc(sizeof(paczka1)); ssize_t liczba_bajtow; wiad->mtype = 1; wiad->pid = pid; msgsnd(f, wiad, wielkosc1, 0); free(wiad); klucz_kolejka = ftok(sciezka, pid); free(sciezka); f1 = msgget(klucz_kolejka, 0600 | IPC_CREAT | IPC_EXCL); paczka2 *praca; const size_t wielkosc2 = sizeof(paczka2) - sizeof(long); double a = 0; printf("Klient: Podaj liczbe: "); scanf("%lf", &a); praca = (paczka2 *)malloc(sizeof(paczka2)); praca->mtype = 2; praca->melement = a; if (czy_czekac) { printf("Klient: Oczekuje %d sekund na wyslanie wiadomosci do serwera.\n", liczba_sekund); sleep(liczba_sekund); } msgsnd(f1, praca, wielkosc2, 0); liczba_bajtow = msgrcv(f1, praca, wielkosc2, 3, 0); printf("Klient: Odebralem %ld bajtow od serwera.\n", liczba_bajtow); printf("Klient: Wynik: %lf^2 = %lf.\n", a, praca->melement); free(praca); msgctl(f1, IPC_RMID, NULL); return 0; }