Skip to content

Instantly share code, notes, and snippets.

@Lifree
Created June 16, 2015 11:58
Show Gist options
  • Save Lifree/e9ce2140a65aafbccc95 to your computer and use it in GitHub Desktop.
Save Lifree/e9ce2140a65aafbccc95 to your computer and use it in GitHub Desktop.
BS_Events_Proc
#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