Exemplo n.º 1
0
int main(const int argc, const char* argv[])
{
	struct server s;
	s.port = DEFAULT_PORT;

	// Process user arguments.
	process_args(&s, argv, argc);

#ifdef DEBUG
	fprintf(stderr, "Server: Creating barber process.\n");
#endif

	int pid = fork();
	if (pid == -1) {
		perror("Error while creating barber process");
		return EXIT_FAILURE;
	}

	if (!pid) { // Barber (child) process.
		barber();
	}
	else {
		// Ignore SIGCHLD. 
		signal(SIGCHLD, SIG_IGN);

		// Initialize server socket and bind it.
		if (server_init(&s, s.port) == -1) {
			perror("Error while init. of server");
			return EXIT_FAILURE;
		}

		printf("Server is running on port: %d\n", s.port);
		server_start(&s); // Run Forest, run!

		// Stop server, free memory and wait.
		server_stop(&s);
	}

	// Try removing semaphores.
	int semaphores = semaphores_init(getuid());
	semctl(semaphores, 0, IPC_RMID, NULL);

	return EXIT_SUCCESS;
}
Exemplo n.º 2
0
int main(int argc, char* argv[])
{
    //Spracovanie prikazovej riadky
    argumenty(argc, argv);

    //Zoznam procesov pre error handling
    zoznam_procesov =  mmap(NULL,sizeof( pid_t[ (3*n+2) ] ), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS, -1 , 0);
    if( zoznam_procesov == NULL) //nepodaril sa mmap
    {
        FATAL_ERROR("zoznam_procesov_mmap");
    }

    semafory =  mmap(NULL,sizeof( struct semaphores ), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS, -1 , 0);
    if( semafory == NULL) //nepodaril sa mmap
    {
        FATAL_ERROR("semafory_mmap");
    }
    //Nastavenie semafora a premennych na 0
    semaphores_init(semafory);

    //Vytvorime si zdielanu pamat
    //kedze pri fork sa prenasaju aj namapovane, tak to robim tu
    premenne =  mmap(NULL,sizeof( struct shared_variables ), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS, -1 , 0);
    if( premenne == NULL) //nepodaril sa mmap
    {
        FATAL_ERROR("premenne_mmap");
    }
    //Nastavenie semafora a premennych na 0
    shared_variables_init(premenne);
    //Otvorime si subor na vypis
    premenne->subor=fopen("h2o.out","a");
    if(premenne->subor==NULL)
    {
        FATAL_ERROR("fopen");
    }



    //Generator kyslika
    pid_t O_gen=fork();
    //Zapiseme si pid procesu keby sme ho potrebovali v pripade chyby kill
    NEW_FORK(O_gen);
    if(O_gen >= 0) // fork sa podaril
    {
        if(O_gen == 0) // Toto robi O_gen
        {
            generator(n,0);
        }
        else // Toto Main
        {
            //Generator vodika
            pid_t H_gen=fork();
            //Zapiseme si pid procesu keby sme ho potrebovali v pripade chyby kill
            NEW_FORK(H_gen);
            if( H_gen >= 0 )
            {
                if( H_gen == 0 )//toto robi H_gen
                {
                    generator(2*n,1);
                }
            }
            else //fork zlyhal
            {
                fclose(premenne->subor);
                FATAL_ERROR("H_gen_fork");
            }
        }
    }
    else // fork zlyhal
    {
        fclose(premenne->subor);
        FATAL_ERROR("O_gen_fork");
    }

    //Caka kym generatory neskoncia
    //lebo generatory skoncia az ked skoncia vsetky procesi atomov
    while(wait(NULL)>0)
    ;

    //Uzavrieme subor kam sme zapisovali
    fclose(premenne->subor);

    //Ked funckia cleanup upratuje, tak zastane hlavny proces na semafore
    sem_wait(&semafory->Error_handling);

    //Ak nastala chyba a bola zavolana funkcia cleanup, tak error bude 1
    //v tejto fazy su tak ci tak vsetky ostatne procesi mrtve, takze nepouzivam semafor
    //lebo pouzitie semaforu by mohlo sposobit problemi ak bol zavolany cleanup
    //lebo nie je jasne v akom stave semafory zanechal
    if(premenne->error!=0)
    {
        exit(2);
    }
    else
    {
        exit(0);
    }
}