Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/shm.h>
- #include <sys/sem.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <string.h>
- #include <err.h>
- #include <unistd.h>
- #include <time.h>
- #include <sys/types.h>
- #define MAX 256
- #define ODCZYT 0
- #define ZAPIS 1
- /// ---- deklaracje
- int pamiec, semafory[2];
- static struct sembuf semafor;
- /*Nadanie slowom znacznie wartosci (aby ulatwic pisanie kodu)*/
- enum {
- PRACUJ, CZEKAJ, INIT
- } stan;
- // informacje procesow
- typedef struct {
- int pid[4];
- char buf12[MAX];
- char buf23[MAX];
- } mem;
- mem *memory;
- const char *kolejka[4] = {"", "fifo1", "fifo2", "fifo3"}; // kolejki
- void push(int, int); // podnoszenie semafora
- void pop(int, int); // opuszczanie semfora
- static void get_sig(int); // reakcja na sygnal
- void wait4pids(); // wstrzymanie procesow do momentu utworzenia ich wszystkich
- void proces1();
- void proces2();
- void proces3();
- ///----
- int main(int argc, char *argv[]) {
- int i; // petle
- //semafory - utworzenie i przypisanie im wartosci
- for (i = 0; i < 2; i++) {
- semafory[i] = semget(IPC_PRIVATE, 2, 0644);
- semctl(semafory[i], 0, SETVAL, (int) 0);
- semctl(semafory[i], 0, SETVAL, (int) 1);
- }
- //tworzenie segmentu pamieci wspoldzielonej
- //potomkowie dziedzicza pamiec
- pamiec = shmget(IPC_PRIVATE, sizeof(mem), 0644);
- //podpiecie pod pamiec wspoldzielona
- memory = (mem *) shmat(pamiec, NULL, 0);
- /*kolejki
- * 064
- * owner read & write
- * other read
- */
- mkfifo(kolejka[1], 0644);
- mkfifo(kolejka[2], 0644);
- mkfifo(kolejka[3], 0644);
- //sygnaly
- signal(SIGUSR1, get_sig);
- signal(SIGUSR2, get_sig);
- signal(SIGINT, get_sig);
- signal(SIGCONT, get_sig);
- // zapisanie identyfikatora procesu macierzystego
- memory->pid[0] = getpid();
- stan = INIT;
- int pid[4];
- //proces 1
- if ((pid[1] = fork()) == 0) {
- proces1();
- } else if ((pid[2] = fork()) == 0) {
- proces2();
- } else if ((pid[3] = fork()) == 0) {
- proces3();
- } else {
- for (i = 1; i < 4; memory->pid[i] = pid[i], i++)
- if (pid[1] < 0)
- return 1;
- kill(memory->pid[1], SIGINT);
- kill(memory->pid[2], SIGINT);
- kill(memory->pid[3], SIGINT);
- }
- return 0;
- }
- ///------
- //SEMAFORY
- ///------
- void push(int semid, int semnum) {
- semafor.sem_flg = 0;
- semafor.sem_num = semnum; // numer semafora
- semafor.sem_op = 1; // kierunek semfaora
- if (semop(semid, &semafor, 1) == -1) {
- printf("Blad podnoszenia semafora");
- exit(1);
- }
- }
- void pop(int semid, int semnum) {
- semafor.sem_flg = 0;
- semafor.sem_num = semnum; // numer semafora
- semafor.sem_op = -1; // kierunek
- if (semop(semid, &semafor, 1) == -1) {
- printf("Blad opuszczania semafora");
- exit(1);
- }
- }
- static void get_sig(int signo) {
- if (stan == INIT) {
- stan == PRACUJ;
- return;
- }
- int pnr, fs, _pid = getpid();
- for (pnr = 1; _pid != memory->pid[pnr] && pnr <= 3; ++pnr);
- if (pnr == 4) {
- printf("Przekroczenie");
- exit(1);
- }
- if (signo != SIGUSR2) {
- int i;
- for (i = 1; i <= 3; ++i)
- if (i != pnr) {
- kill(memory->pid[i], SIGUSR2);
- int f = open(kolejka[i], O_WRONLY);
- write(f, &signo, sizeof(signo));
- close(f);
- }
- } else {
- fs = open(kolejka[pnr], O_RDONLY);
- read(fs, &signo, sizeof(signo));
- close(fs);
- }
- if (signo == SIGINT) {
- if (pnr == 1) {
- shmctl(pamiec, IPC_RMID, 0);
- semctl(semafory[0], IPC_RMID, 0);
- semctl(semafory[1], IPC_RMID, 0);
- }
- unlink(kolejka[pnr]);
- exit(0);
- } else if (signo == SIGUSR1) {
- stan = CZEKAJ;
- } else if (signo == SIGCONT) {
- stan = PRACUJ;
- }
- }
- void wait4pids() {
- pause();
- memory = (mem *) shmat(pamiec, NULL, 0);
- if (!memory) {
- printf("Plad podpiecia pamieci");
- exit(1);
- }
- }
- void proces1() {
- wait4pids();
- char buf[MAX];
- while (fgets(buf, sizeof(buf), stdin) > 0) {
- while (stan == CZEKAJ)pause();
- pop(semafory[0], ZAPIS);
- strncpy(memory->buf12, buf, sizeof(memory->buf12));
- push(semafory[0], ODCZYT);
- }
- get_sig(SIGINT);
- }
- void proces2() {
- wait4pids();
- char buf[MAX];
- pop(semafory[0], ODCZYT);
- strncpy(buf, memory->buf12, sizeof(buf));
- push(semafory[0], ZAPIS);
- //--funkcja();
- *buf = "15";
- pop(semafory[1], ZAPIS);
- strncpy(memory->buf23, buf, sizeof(memory->buf23));
- push(semafory[1], ODCZYT);
- }
- void proces3() {
- wait4pids();
- char buf[MAX];
- pop(semafory[1], ODCZYT);
- strncpy(buf, memory->buf23, sizeof(buf));
- push(semafory[1], ZAPIS);
- printf(buf);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement