Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C] semafori

  1. #1

    [C] semafori

    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..

  2. #2

  3. #3
    1) Dalla manpage (FreeBSD 5.0): Semctl() performs the operation indicated by the third parameter on the semaphore indicated by the first parameter.

    Se conosci quello che fa atoi() l'arcano è spiegato. In pratica si tratta di un banalissimo metodo per mandare on-the-fly comandi al semaforo senza dover ricompilare ogni volta.

    2) Di solito su stderr vengono mandati messaggi destinati a segnalare errori (stderr è stato creato appositamente e giustamente è none-buffered).

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  4. #4

  5. #5
    nglrossi, sei sicuro che in 3 secondi tutti i figli saranno stati creati ed eseguiti?

    il loop di down non è corretto, per come è fatto il codice basterebbe un'unica down.

    per essere corretto il codice avrebbe dovuto inizializzare il semaforo a n_figli + 1

    il padre dovrebbe fare una down e bloccarsi
    ogni figlio dovrebbe fare una down e non un waitzero

    dopo avere eseguito le n + 1 down il semaforo si sblocca e passano la barriera tutti insieme.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.