示例#1
0
文件: process2.c 项目: jbylina/SO
static void sigHandler(int signo)
{

    if(signo == common_sig_t[0]) // start
    {
        if( semVal(pkg->sem_id , 0)  > 0 )
        {
            semlock(pkg->sem_id , 0);
        }
    }
    else if(signo == common_sig_t[1]) // stop
    {
        if( semVal(pkg->sem_id , 0)   == 0)
        {
            semunlock(pkg->sem_id , 0);
        }

    }
    else if(signo == common_sig_t[2]) // koniec
    {

        semlock(pkg->sem_id, 4); // ustawienie flagi sygnalu do zabicia procesu nr 2

        if( semVal(pkg->sem_id , 0)  > 0 ) // jesli dostaniemy podczas  waita
        {
            semlock(pkg->sem_id , 0);
        }

    }

}
示例#2
0
文件: process2.c 项目: jbylina/SO
static void * mainLoop(void * write_pipe_fd )
{
    char * shm = pkg->shm_ptr;
    int * fd = (int *)write_pipe_fd;

    killfd = *fd;

    unsigned char readed_bytes;

    while(1)
    {
        semlock(pkg->sem_id, 2);

        if( !semVal(pkg->sem_id , 4) )
        {
            kill(pid_p3,communication_sig_t[2]); // poinformowanie procesu 3

            if( semVal(pkg->sem_id, 3) ) // ustawienie flagi sygnalu do zabicia procesu nr 1
            {
                semlock(pkg->sem_id, 3);
            }

            if( semVal(pkg->sem_id , 0) > 0 )
            {
                semlock(pkg->sem_id , 0); // jbc odblokowanie jesli dostalismy kill podczas stopu
            }

            semunlock(pkg->sem_id, 1); // wpuszczenie proc 1 do sprawdzenia flagi i zabicia sie

            write(killfd, &killfd , sizeof(char) ); // odblokowanie procesu nr 3 aby sie zabil

            break;
            /*pthread_cancel(thread);
            pthread_testcancel(); */
        }

        readed_bytes = (unsigned char)shm[0];
        write(*fd, &shm[1] ,readed_bytes);
        semunlock(pkg->sem_id , 1);
    }

    pthread_exit(EXIT_SUCCESS);
}
示例#3
0
文件: process2.c 项目: jbylina/SO
static void communicationSigHandler(int signo)
{
    if(signo == communication_sig_t[0]) // start
    {

        if( semVal(pkg->sem_id , 0) > 0 )
        {
            semlock(pkg->sem_id , 0);
        }

    }
    else if(signo == communication_sig_t[1]) // stop
    {
        if( semVal(pkg->sem_id , 0)  == 0)
        {
            semunlock(pkg->sem_id , 0);
        }

    }
    else if(signo == communication_sig_t[2]) // koniec
    {
        sigHandler(common_sig_t[2]);
    }
}
示例#4
0
void Entree(TypeBarriere typeBarriere)
{
	//definition des id d'acces au boites aux lettres et semaphores
	long msgBufEntreeId;
	long msgbufRequeteId;
	unsigned short semElementSyncEntree;
    TypeZone zoneEcranRequete;
	switch (typeBarriere)
	{
		case PROF_BLAISE_PASCAL :
			//deja initialises aux bonnes valeurs;
			msgBufEntreeId = MSGBUF_ID_ENTREE_P;
			msgbufRequeteId = MSGBUF_ID_REQUETE_P;
	 		semElementSyncEntree = SEMELM_SINC_ENTREE_P;
            zoneEcranRequete = REQUETE_R1;
			break;
			
		case AUTRE_BLAISE_PASCAL :
		
			msgBufEntreeId = MSGBUF_ID_ENTREE_A;
			msgbufRequeteId = MSGBUF_ID_REQUETE_A;
			semElementSyncEntree = SEMELM_SINC_ENTREE_A;
            zoneEcranRequete = REQUETE_R2;
			break;

		case ENTREE_GASTON_BERGER :
		
			msgBufEntreeId = MSGBUF_ID_ENTREE_GB;
			msgbufRequeteId = MSGBUF_ID_REQUETE_GB;
			semElementSyncEntree = SEMELM_SINC_ENTREE_GB;
            zoneEcranRequete = REQUETE_R3;
			break;

		default :

			std::cerr << "not an entry process error" << std::endl;
            return;
			break;
	}
    //initialisation
    init();

    //phase moteur
    pid_t pidCurr;
    Voiture voiture;
    for(;;)
    {
        //appel bloquant, attente d'une demande d'entree
        if(msgrcv(msgbuffId, &voiture, sizeof(Voiture)-sizeof(long), msgBufEntreeId, 0) == -1)
            continue; // sarestart (sur les erreurs aussi)
		DessinerVoitureBarriere(typeBarriere, voiture.typeUsager);
		
		if(semVal(SEMELM_PLACEDISPO) > 0)
		{
			if((pidCurr = GarerVoiture(typeBarriere)) != -1)
			{
				semP(SEMELM_PLACEDISPO);
				mapVoiturier.insert(std::pair<pid_t, Voiture>(pidCurr, voiture));
			}
		}
		else
		{
            //affiche requete
            AfficherRequete(typeBarriere,voiture.typeUsager,voiture.heureArrivee);
            Requete re;
            re.type = msgbufRequeteId;
            re.heureArrivee = voiture.heureArrivee;
            re.typeUsager = voiture.typeUsager;
            if(msgsnd(msgbuffId, &re, sizeof(Requete)-sizeof(long), 0 )==-1);
			semP(semElementSyncEntree);
			if((pidCurr = GarerVoiture(typeBarriere)) != -1)
			{
                //met à jour l'heure d'entree dans le parking
                voiture.heureArrivee = time(NULL);
				mapVoiturier.insert(std::pair<pid_t, Voiture>(pidCurr, voiture));
			}
            Effacer(zoneEcranRequete);
		}
    }
}