linux user group brescia

immagine del castello

Archivio della mailing list

Varie ed eventual

Luca Giuzzi giuzzi a dmf.bs.unicatt.it
Gio 22 Feb 2001 17:22:02 UTC
1. la syscall __clone e' una brutta bestia ;)
  piu' leggera di pthreads? Sicuramente si'... attento pero' che
  printf non e' rientrante come default (a quanto mi ricordo) e questo
  potrebbe darti qualche problemuzzo.
 
Un esempio (orribile) di clone e' il seguente:

/* Esempio di clone */
#include<stdio.h>
#include<sched.h>
int i;
int in_cloned()
{
    while (1) {
        i++;
	usleep(5000);
    }
}
int main()
{
    void **stack1;
    i = 1;
    stack1 = (void **) malloc(64);
    __clone(in_cloned, stack1, CLONE_VM, NULL);
    sleep(2);
    printf("In main...\n");
    while (1) {
        printf("%i\n", i);
	sleep(1);
    }
}

la funzione in_cloned() viene esseguita nel secondo thread e incrementa
 la variabile "i". Il thread principale si preoccupa di stamparne il
 valore.

 [il codice che configura i 2 processi con fork sarebbe leggermente 
  diverso, a causa della diversa sintassi di fork()...

  /* NON FUNZIONA ;)) */
  int main()
  {
      void **stack1;
      i = 1;
      stack1 = (void **) malloc(8192);
      if(!fork())
       { in_cloned(); }
      printf("In main...\n");
      while (1) {
          printf("%i\n", i);
	  sleep(1);
      }
  }

 ma, come dice il commento, non funziona: la copia del programma in cui
  viene eseguita in_cloned() non condivide lo spazio indirizzi con il
  programma principale, anche se i e' una variabile globale]

P.S.
 Per i puristi: liberero' le malloc quando while uscira' :)))

Ciao,
 lg



Maggiori informazioni sulla lista Lug