void sigint_handler(int sig) { signal(sig, SIG_IGN); printf("Shutting down... \n"); // f**k off, doing things aem random things break all pthread_cancel(listener_thread_id); pthread_cancel(fragen_thread_id); sem_remove(keymng_local(KEY_GCI_SEM)); sem_remove(keymng_local(KEY_QUESTION)); printf("OK\n"); exit(0); }
int main() { unsigned short int values[]={1,1}; int sem_ID=sem_init(2, values); int shm1=shmget(12355,sizeof(int),IPC_CREAT|0666); int shm2=shmget(13456,sizeof(int),IPC_CREAT|0666); int* x=(int*)shmat(shm1,0,0); int* y=(int*)shmat(shm2,0,0); //int* x = (int*)mmap(NULL,sizeof(int),PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); // int* y = (int*)mmap(NULL,sizeof(int),PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); pid_t pid=vfork(); if(pid==0) { pid=fork(); if(pid!=0) { p1(sem_ID,x,y); } else { p2(sem_ID,x,y); } } else sem_remove(sem_ID); shmdt(x); shmdt(y); return 0; }
static void handle_int(int sign) { if(sign == SIGINT) { server_close(connection); if(!db_close(database)) { log_send(LEVEL_ERROR, "[MAIN SV] Couldn't correctly logout from database."); } sem_remove(server_sems); log_close(); exit(EXIT_FAILURE); } else if(sign == SIGCHLD) { int status; (*clients)--; waitpid(-1, &status, 0); } }
void sem_delete(EnvT *e) { SizeT nParam = e->NParam(1); DString name; e->AssureStringScalarPar(0, name); const sem_data_t &data = sem_get_data(name, e); #if defined(_WIN32) && !defined(__CYGWIN__) CloseHandle(data.sem); #else sem_close(data.sem); if (sem_is_deletable(data)) { sem_unlink(name.c_str()); } #endif sem_remove(name); }
/* * Remove a Named Semaphore */ int oskit_sem_unlink(const char *name) { int i; sem_t *sem; /* Lock the semaphore name space */ pthread_mutex_lock(&semn_space.semn_lock); /* Unlink the specified queue from the queue name space */ for (i = 0 ; i < semn_space.semn_arraylen ; i++) { if (semn_space.semn_array[i] && (strcmp(semn_space.semn_array[i]->sem_name, name) == 0)) { /* Found */ sem = semn_space.semn_array[i]; /* Lock the semaphore */ pthread_lock(&sem->sem_lock); if (sem->sem_refcount != 0) { sem->sem_flag |= SEM_UNLINK_FLAG; pthread_unlock(&sem->sem_lock); } else { sem_remove(sem); } /* * Unlink the association between the semaphore * name space to the semaphore. */ semn_space.semn_array[i] = NULL; pthread_mutex_unlock(&semn_space.semn_lock); return 0; } } /* Unlock the queue name space */ pthread_mutex_unlock(&semn_space.semn_lock); return ENOENT; }
int main(int argc, char const * argv[]) { const char * config_file; int connection_numer = 0, ret, pid; short vals[SEM_SIZE] = {1, 1}; key_t key = ftok("database.sql", KEY_ID); key_t key_db = ftok("database.sql", KEY_DB_ID); switch(argc) { case 1: { config_file = CONFIG_FILE_DEFAULT; } break; case 2: { config_file = argv[1]; } break; default: { fprintf(stderr, "Usage: 'server.app [config_file]'.\n"); exit(EXIT_FAILURE); } } pcg32_srandom(time(NULL), (intptr_t)&connection_numer); server_sems = sem_make(key, SEM_SIZE, vals); if(server_sems == -1) { fprintf(stderr, "1 Can't create neccessary data to operate.\n"); exit(EXIT_FAILURE); } bettors = mmap(NULL, sizeof(*bettors), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if(bettors == MAP_FAILED) { fprintf(stderr, "2 Can't create neccessary data to operate.\n"); exit(EXIT_FAILURE); } clients = mmap(NULL, sizeof(*clients), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if(clients == MAP_FAILED) { fprintf(stderr, "3 Can't create neccessary data to operate.\n"); exit(EXIT_FAILURE); } winner = mmap(NULL, sizeof(*winner) * MAX_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if(winner == MAP_FAILED) { fprintf(stderr, "4 Can't create neccessary data to operate.\n"); exit(EXIT_FAILURE); } *bettors = 0; *clients = 0; memset(winner, 0, sizeof(*winner) * MAX_SIZE); if(!log_open()) { fprintf(stderr, "Can't connect logging server.\n"); //exit(EXIT_FAILURE); } database = smemory_open(key_db); // TODO: define 8080 if(database == NULL) { fprintf(stderr, "Can't reach the database.\n"); exit(EXIT_FAILURE); } connection = server_open(config_file); if(connection == NULL) { fprintf(stderr, "Can't create the main connection.\n"); exit(EXIT_FAILURE); } signal(SIGINT, handle_int); signal(SIGCHLD, handle_int); while(TRUE) { connection_t connection_accepted; connection_accepted = server_accept(connection); if(connection_accepted == NULL) { log_send(LEVEL_ERROR, "[MAIN SV] Can't connect to client."); exit(EXIT_FAILURE); // TODO: Exit? } connection_numer++; (*clients)++; pid = fork(); if(pid == -1) { log_send(LEVEL_ERROR, "[MAIN SV] Can't assign resources to client."); exit(EXIT_FAILURE); // TODO: Exit? } if(!pid) { // Child process // sem_lock(server_sems, 1); // (*clients)++; // sem_unlock(server_sems, 1); server_ajar(connection); log_send(LEVEL_INFO, "[CHILD SV] Disconnecting main connection."); ret = handle(connection_accepted); if(ret == EXIT_FAILURE) { log_send(LEVEL_ERROR, "[CHILD SV] There was an error handling client."); } server_close(connection_accepted); log_send(LEVEL_INFO, "[CHILD SV] Closed client connection."); // sem_lock(server_sems, 1); // (*clients)--; // sem_unlock(server_sems, 1); exit(ret); } log_send(LEVEL_INFO, "[MAIN SV] Disconnecting new connection."); server_ajar(connection_accepted); } server_close(connection); if(!db_close(database)) { log_send(LEVEL_ERROR, "[MAIN SV] Couldn't correctly logout from database."); } log_close(); sem_remove(server_sems); return 0; }