/* Copyright (C) 2009 by Mattia Monga */ /* $Id$ */ #include #include #include #include #include int run(void* s) { int* shared = (int*)s; // alias per comodit\`a while (shared[0] < 10) { sleep(1); printf("Processo figlio (%d). s = %d\n", getpid(), shared[0]); if (!(shared[0] < 10)){ printf("Corsa critica!!!!\n"); abort(); } shared[0] += 1; } return 0; } int main(void){ int shared[2] = {0 , 0}; /* int clone(int (*fn)(void *), * void *child_stack, * int flags, * void *arg); * crea una copia del chiamante (con le caratteristiche * specificate da flags) e lo esegue partendo da fn */ if (clone(run, /* il nuovo * processo esegue run(shared), vedi quarto * parametro */ malloc(4096)+4096, /* lo stack del nuovo processo * (cresce verso il basso!) */ SIGCHLD, // in questo caso la clone \`e analoga alla fork shared) < 0){ perror("Errore nella creazione");exit(1); } if (clone(run, malloc(4096)+4096, SIGCHLD, shared) < 0){ perror("Errore nella creazione");exit(1); } /* Isolati: ciascuno dei figli esegue 10 volte. */ // Per il padre shared[0] \`e \textbf{sempre} 0 */ while(shared[0] == 0) { sleep(1); printf("Processo padre. s = %d\n", shared[0]); } return 0; } /* Local Variables: */ /* compile-command: "make -k " */ /* End: */