/************ Ecriture dans une zone de mmoire partage : 4 processus fils *************/
int main (int argc, char ** argv) {
long i, k, temp; long * ptz ; int p1,p2,p3,p4, key, shm_id ;
key = atoi(argv[1]) ;
shm_id = shmget(key, SHMEM_SIZE, SHMEM_RIGHTS) ;
ptz = (long *) shmat(shm_id, 0, SHMEM_RIGHTS) ;
if ((p1 = fork()) == 0) {
for(i=0;i<10000000;i++) {
temp = *ptz ; temp ++ ; * ptz = temp ; //(*ptz) ++ ;
}
exit(0) ;
}
if ((p2 = fork()) == 0) {
for(i=0;i<10000000;i++) {
temp = *ptz ; temp ++ ; * ptz = temp ; //(*ptz) ++ ;
}
exit(0) ;
}
if ((p3 = fork()) == 0) {
for(i=0;i<10000000;i++) {
temp = *ptz ; temp ++ ; * ptz = temp ; //(*ptz) ++ ;
}
exit(0) ;
}
if ((p4 = fork()) == 0) {
for(i=0;i<10000000;i++) {
temp = *ptz ; temp ++ ; * ptz = temp ; //(*ptz) ++ ;
}
exit(0) ;
}
printf("\n Arret processus pid = %d\n\n", getpid()) ;
exit(0) ;
5
}
Crible dEratostne
Rappel : le crible dEratostne est un algorithme
simple qui permet de dterminer les nombres
premiers. Etant donn un tableau dentiers de 1 N, il
sagit de parcourir ce tableau et dliminer chaque
passage les multiples du premier nombre. On passe
ensuite au nombre suivant (qui est premier !) et on
limine ses multiples
Remarque : Eratostne (v. 276-v. 194 av. J.-C.), mathmaticien,
astronome, gographe et pote grec qui mesura la circonfrence
de la Terre avec une surprenante prcision en dterminant
astronomiquement la diffrence de latitude entre les cits de
Syne (aujourd'hui Assouan) et d'Alexandrie, en gypte.
8
Crible dEratostne
Crible dEratostne
Example
10
11
...
1
t[0] t[1]
11
11
10
11
...
t[9] t[10]
...
Ensuite le programme principal - crible_v1.c - devra raliser les
liminations des multiples en lanant plusieurs fois (de manire
rcursive) le programme secondaire multiple_v1.c capable de
supprimer dans ce tableau tous les multiples du dernier nombre
premier trouv.
...
Crible dEratostne
10
Exercice :
*/
11
12
sleep(1);
switch ( (fils = fork()) ) {
case -1 :
perror("fork echoue") ; exit(0) ;
case 0 : /*processus fils */
for(i=mult ; i<n ; i++)
if(t[i]) {
sprintf(str_mult, "%d", t[i]) ;
execlp("multiple_v1","multiple_v1",argv[1], argv[2],str_mult,NULL);
sleep(1) ;
execlp("multiple_v1","multiple_v1",argv[1], argv[2], "2", NULL) ;
13
14