Example #1
0
static void sigChldHandler(int noSig, siginfo_t *siginfo, void *context)
{
	std::map<pid_t, Voiture>::iterator voiturierIt = mapVoiturier.find(siginfo->si_pid);
	if(voiturierIt == mapVoiturier.end())
    {
    	return; //si le signal n'a pas ete envoye par un voiturier
    }
    else
    {
        //affiche sur l'IHM
        AfficherPlace(siginfo->si_status,voiturierIt->second.typeUsager,voiturierIt->second.immatriculation,
                      voiturierIt->second.heureArrivee);
        //ajoute la voiture au parking
    	semP(SEMELM_MP_PARKING);
    	mpParking[siginfo->si_status] = voiturierIt->second;
    	semV(SEMELM_MP_PARKING);
    	mapVoiturier.erase(voiturierIt);
    }
}
Example #2
0
int main(int argc,char **argv)
{
	//1.Get shared memory
	void *shmaddr;
	int shmid = shmGetExist(SHMKEY,&shmaddr);
	int semid = semGetExist(SEMKEY);

	//3.use shared memory
	char buf[BUFLEN];
	while(1)
	{
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1] = 0;
		strcpy(shmaddr,buf);
		semV(semid,0);
		if(strcmp(buf,"end")==0)
			break;
	}
	
	//4.detach shared memory
	shmFree(shmaddr);
	return 0;
}
static
void
makeprocs(bool dowait)
{
    int i, status, failcount;
    struct usem s1, s2;
    pid_t pids[NJOBS];

    if (dowait) {
        semcreate("1", &s1);
        semcreate("2", &s2);
    }

    tprintf("Job size approximately %lu bytes\n", (unsigned long) JOBSIZE);
    tprintf("Forking %d jobs; total load %luk\n", NJOBS,
            (unsigned long) (NJOBS * JOBSIZE)/1024);

    for (i=0; i<NJOBS; i++) {
        pids[i] = fork();
        if (pids[i]<0) {
            warn("fork");
        }
        if (pids[i]==0) {
            /* child */
            if (dowait) {
                //tsay("Process %d forked\n", i);
                semopen(&s1);
                semopen(&s2);
                semV(&s1, 1);
                semP(&s2, 1);
                semclose(&s1);
                semclose(&s2);
            }
            go(i);
        }
    }

    if (dowait) {
        semopen(&s1);
        semopen(&s2);
        //tsay("Waiting for fork...\n");
        semP(&s1, NJOBS);
        //tsay("Starting computation.\n");
        semV(&s2, NJOBS);
    }

    failcount=0;
    for (i=0; i<NJOBS; i++) {
        if (pids[i]<0) {
            failcount++;
        }
        else {
            if (waitpid(pids[i], &status, 0)<0) {
                err(1, "waitpid");
            }
            if (status_is_failure(status)) {
                failcount++;
            }
        }
    }

    if (failcount>0) {
        printf("%d subprocesses failed\n", failcount);
        exit(1);
    }
    nprintf("\n");
    tprintf("Test complete\n");
    success(TEST161_SUCCESS, SECRET, "/testbin/parallelvm");

    semclose(&s1);
    semclose(&s2);
    semdestroy(&s1);
    semdestroy(&s2);
}