예제 #1
0
파일: client.c 프로젝트: hswgtSysprog/YDKR
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);
}
예제 #2
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;
}
예제 #3
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);
	}
}
예제 #4
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);
  }
예제 #5
0
/*
 * 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;
}
예제 #6
0
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;
}