Created
June 16, 2015 11:58
-
-
Save Lifree/e9ce2140a65aafbccc95 to your computer and use it in GitHub Desktop.
BS_Events_Proc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <signal.h> | |
#include <sys/mman.h> | |
#include <sys/stat.h> | |
#include <fcntl.h> | |
#include <sys/types.h> | |
#include <sys/wait.h> | |
#include <unistd.h> | |
#include <time.h> | |
#include <semaphore.h> | |
void error_handler(char* msg){perror(msg);exit(EXIT_FAILURE);} | |
void askTicketsOnEvent(int index,int tickets); | |
void serverReadsEvents(); | |
void create_shm(void); | |
void close_shm(void); | |
void handler_usig1(int sig); | |
void exit_handeler(int sig); | |
#define EVENTS 30 | |
char* NAME = "/arr"; | |
char* SEMA = "/semaphore"; | |
sem_t* sem_fd[EVENTS]; | |
sem_t* sem_fd_complete; | |
int* arr; | |
int* par_pid; | |
int* new; | |
int main(int argc, char const *argv[]) | |
{ | |
signal(SIGINT,exit_handeler); | |
signal(SIGUSR1,handler_usig1); | |
//int status; | |
if (argc!=2) | |
{ | |
error_handler("USAGE: PRG INT"); | |
} | |
//exit_handeler(1); | |
int tmp = getpid(); | |
par_pid = &tmp; | |
printf("%d \n", *par_pid); | |
int n; | |
sscanf(argv[1],"%d", &n); | |
if((sem_fd_complete = sem_open(SEMA,O_CREAT| O_EXCL ,0660,1))==SEM_FAILED)error_handler("sem_open"); | |
char tmpString[100]; | |
for (int i = 0; i < EVENTS; ++i) | |
{ | |
sprintf(tmpString, "%s%d",SEMA,i); | |
if((sem_fd[i]=sem_open(tmpString,O_CREAT| O_EXCL ,0660,1))==SEM_FAILED)error_handler("sem_open"); | |
} | |
create_shm(); | |
srand(time(NULL)); | |
int pid; | |
int tick; | |
int index; | |
if(fork()!=0){ | |
srand(time(NULL)); | |
for (int j = 0; j < n; ++j){ | |
if((pid=fork())== 0) | |
{ | |
while(1) | |
{ | |
tick = rand() % 20 + 1; | |
index = rand() % EVENTS; | |
askTicketsOnEvent(index, tick); | |
} | |
} | |
} | |
while(1); | |
//printf("running \n"); | |
/*{ | |
for (int i = 0; i < EVENTS; ++i) | |
{ | |
fprintf(stderr,"Veranstaltung %d hat %d karten \n",i,arr[i]); | |
} | |
}*/ | |
} | |
close_shm(); | |
exit_handeler(1); | |
return EXIT_SUCCESS; | |
} | |
void askTicketsOnEvent(int index,int tickets){ | |
signal(SIGUSR1,handler_usig1); | |
signal(SIGINT,exit_handeler); | |
sem_wait(sem_fd_complete); | |
sem_wait(sem_fd[index]); | |
sem_post(sem_fd_complete); | |
if(tickets <= arr[index]){ | |
arr[index] = arr[index] - tickets; | |
//printf("%p, %d, %d\n", sem_fd[index],index,getpid()); | |
printf("Prozess %5d hat %3d Freikarten für Veanstaltung %3d erhalten\n", getpid(), tickets, index); | |
} | |
else{ | |
printf("Veanstaltung %3d hat nurmehr %2d < %2d Freikarten\n", index, arr[index], tickets); | |
} | |
if(arr[index] == 0) | |
{ | |
sem_post(sem_fd[index]); | |
//raise(/**par_pid,*/SIGUSR1); | |
//printf("%d \n", *par_pid); | |
kill(*par_pid,SIGUSR1); | |
} | |
else | |
sem_post(sem_fd[index]); | |
} | |
void serverReadsEvents(){ | |
signal(SIGUSR1,handler_usig1); | |
signal(SIGINT,exit_handeler); | |
sem_wait(sem_fd_complete); | |
for (int i = 0; i < EVENTS; ++i) | |
{ | |
if(arr[i]==0){ | |
arr[i] = rand() % 120 + 30; | |
} | |
printf("Veranstaltung %d hat noch %d tickets\n", i, arr[i]); | |
} | |
sem_post(sem_fd_complete); | |
} | |
void create_shm(void){ | |
int fd; | |
if((fd = shm_open(NAME, O_RDWR | O_CREAT, 0660))==-1)error_handler("shm_open "); | |
if(ftruncate(fd,sizeof(int)*30)==-1)error_handler("ftruncate"); | |
if((arr = (int*) mmap(NULL,sizeof(int)*30, PROT_WRITE, MAP_SHARED, fd, 0))==MAP_FAILED)error_handler("mmap "); | |
for (int i = 0; i < 30; ++i) | |
{ | |
serverReadsEvents(); | |
} | |
close(fd); | |
} | |
void close_shm(void){ | |
munmap(NAME,sizeof(int)*30); | |
shm_unlink(NAME); | |
} | |
void handler_usig1(int sig){ | |
serverReadsEvents(); | |
} | |
void exit_handeler(int sig){ | |
close_shm(); | |
sem_unlink(SEMA); | |
char tmpString[100]; | |
for (int i = 0; i < EVENTS; ++i) | |
{ | |
sprintf(tmpString, "%s%d",SEMA,i); | |
sem_unlink(tmpString); | |
} | |
exit(EXIT_SUCCESS); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment