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); } }
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); }