SK/22-12-04/ipcs/server.c

108 lines
2.5 KiB
C
Raw Normal View History

2022-12-04 10:00:06 +01:00
/*
Serwer wspolbiezny oparty na kolejekach komunikatow.
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/uio.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
typedef struct mymesg1
{
long mtype;
pid_t pid;
} paczka1;
typedef struct mymesg2
{
long mtype;
double melement;
} paczka2;
int f;
paczka1 *wiad;
char *sciezka;
int czy_skasowac = 1;
void ala(int i)
{
if (i == SIGTERM || i == SIGINT)
{
printf("Serwer: Koniec pracy serwera.\n");
free(wiad);
msgctl(f, IPC_RMID, NULL);
if (czy_skasowac)
{
unlink(sciezka);
}
free(sciezka);
exit(0);
}
}
int main(int argc, char *argv[])
{
pid_t pid;
key_t klucz_kolejka;
const size_t wielkosc1 = sizeof(paczka1) - sizeof(long);
ssize_t liczba_bajtow;
int plik = 0;
signal(SIGTERM, ala);
signal(SIGINT, ala);
sigignore(SIGCHLD);
if (argc > 1)
{
sciezka = strndup(argv[1], strlen(argv[1]));
}
else
{
sciezka = strndup("/tmp/roboczy.kolejka_serwer", strlen("/tmp/roboczy.kolejka_serwer"));
}
if (access(sciezka, F_OK) == 0)
{
czy_skasowac = 0;
}
plik = open(sciezka, O_CREAT | O_EXCL, 0600);
close(plik);
klucz_kolejka = ftok(sciezka, 0);
f = msgget(klucz_kolejka, 0600 | IPC_CREAT | IPC_EXCL);
for (;;)
{
wiad = (paczka1 *)malloc(sizeof(paczka1));
liczba_bajtow = msgrcv(f, wiad, wielkosc1, 1, 0);
printf("Serwer: Przeczytalem %ld bajtow od klienta na glownej kolejce.\n", liczba_bajtow);
pid = fork();
if (pid == 0)
{
int f1;
free(sciezka);
klucz_kolejka = ftok(sciezka, wiad->pid);
f1 = msgget(klucz_kolejka, 0600);
paczka2 *praca = (paczka2 *)malloc(sizeof(paczka2));
const size_t wielkosc2 = sizeof(paczka2) - sizeof(long);
if ((liczba_bajtow = msgrcv(f1, praca, wielkosc2, 2, 0)) == -1)
{
perror("Serwer, proces potomny: Blad funkcji msgrcv.\n");
return -1;
}
printf("Serwer, proces potomny: Przeczytalem %ld bajtow od klienta.\n", liczba_bajtow);
praca->melement *= praca->melement;
praca->mtype = 3;
liczba_bajtow = msgsnd(f1, praca, wielkosc2, 0);
free(praca);
return 0;
}
else
{
sigignore(SIGCHLD);
}
}
}