codice:
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/ipc.h>
4 #include <sys/sem.h>
5
6 // int semget(key_t key, int nsems, int semflg);
7
8 main(int argc, char **argv)
9 {
10 int num_figli = atoi(argv[1]);
11 int i, semSincro;
12 pid_t padre;
13 struct sembuf waitzero, decr;
14
15 /* operazione di attesa dello zero */
16 waitzero.sem_num = 0;
17 waitzero.sem_op = 0;
18 waitzero.sem_flg = 0;
19
20 /* operazione di down */
21 decr.sem_num = 0;
22 decr.sem_op = -1;
23 decr.sem_flg = 0;
24
25 semSincro = semget(IPC_PRIVATE, 1, 0666);
26 semctl(semSincro, 0, SETVAL, atoi(argv[1]));
27 printf("\n DEBUG semid = %d\n", semSincro);
28
29 if (semSincro < 0) {
30 fprintf(stderr, "\n non ho potuto allocare il semaforo ... termino\n");
31 exit(0);
32 }
33
34 for (i=0; i<num_figli; i++) {
35 padre = fork();
36
37 if (padre<0) {
38 fprintf(stderr, "generazione figlio fallita ... termino \n");
39 exit(-1);
40 }
41 else if (!padre) {
42 // mi sospendo
43 // quando siamo stati creati tutti
44 // // ci risvegliamo, facciamo una stampa e terminiamo
45 fprintf(stderr,"\n figlio %d, prima di semop", getpid()); fflush(stderr);
46 semop(semSincro, &waitzero, 1);
47 fprintf(stderr,"\n figlio %d, muoio", getpid()); fflush(stderr);
48 exit(0);
49 }
50 }
51
52 if (padre) sleep(3);
53
54 for (i=0; i<num_figli; i++) semop(semSincro, &decr, 1);
55
56 for (i=0; i<num_figli; i++) wait(0);
57 semctl(semSincro, 0, IPC_RMID, 0);
58
59 }
Rieccomi ad assillarvi..
Qui capisco sempre meno.. in particolare qualcuno saprebbe spiegarmi:
riga 26) perchè viene passato come ultimo parametro l'argomento dell'applicazione?!?
riga 47) perchè chi ha scritto il programma ha deciso di mandare l'output sullo stderror (ci sarà una moivazione?)
in generale non credo di aver ben capito cosa facciano i vari semop e semctl nel listato. Ho letto un po' della sintassi, ma al di là che semop effettua operazioni sui semafori e che semctl controlla le operazioni sui semafori...
Grazie ancora all'anima pia che avrà voglia di illuminarmi..