fbpx
Skip to main content

[LA] Linux avanzato 2008

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
17 Anni 2 Mesi fa #82806 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic [LA] Linux avanzato 2008
Ok grazie (come al solito) pax! :)

Ho inventato un esercizio niente male, per chi volesse... L'ho scritto pure in Bovet-style :)
	Il programma riceve da riga di comando una stringa ed una o più directory (in numero arbitrario >= 1) in cui cercare 
	files regolari che contengano quella stringa nel proprio nome.
	Il processo padre crea un clone per ciascuna directory da controllare. Ciascun clone ha il compito di scrivere in un 
	file di testo (avente nome uguale a quello della directory assegnata, tranne che i caratteri '/' sono stati sostituiti con '_')  i nomi di tutti i file analizzati.
	Non appena un processo clone trova un file che soddisfa i requisiti, scrive nel file di propria competenza "FILE TROVATO" e invia un segnale SIGUSR1 al padre il quale, a sua volta, inoltra un SIGTERM a tutti gli altri processi. 
	Nel ricevere il SIGTERM un clone scrive nel file "FILE NON TROVATO!", lo chiude e quindi ritorna.
	Si consiglia di far dormire ogni clone 1 sec tra una scansione e la successiva per testare l'efficacia del programma.
	

Che ve ne pare? Io sono al punto della gestione dei SIGTERM... Ancora una volta 'sti signal handler tornano scomodi.. Infatti il processo dovrebbe fare l'ultima scrittura e la close nel codice dell'handler e l'unica soluzione che vedo è quella di variabili globali per i fd...

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
17 Anni 2 Mesi fa #82853 da chiara sabbatella
ragazza scusate, sto scrivendo questo codice:

struct struttura
{
int a;
int b;
};

struct struttura s, *s1;

int funz( struct struttura s )
{
printf("I valori nella funzione sono: %d, %d\n", s.a, s.b);
return (0);
}

int main()
{

int pid[3], i = 0; char *cstack[3];

s.a = 2;
s.b = 4;

s1 = &s;
printf("Struttura: %d, %d\n", s.a, s.b);

for(i = 0; i < 3; i++)
{
cstack = (char*)malloc(2048);
pid = clone((void*)funz, cstack + 2048, CLONE_VM, s1);

}

return 0;
}
ma l'output che ne esce è stranissimo:
Struttura: 2, 4
I valori nella funzione sono: 134518488, 0
I valori nella funzione sono: 134518488, 0
I valori nella funzione sono: 134518488, 0

ma perche? Qualcuno saprebbe aiutarmi? Grazie!

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • COM_EASYSOCIAL_GUEST_NAME
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
17 Anni 2 Mesi fa #82856 da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic [LA] Linux avanzato 2008

ragazza scusate, sto scrivendo questo codice:

struct struttura
{
int a;
int b;
};

struct struttura s, *s1;

int funz( struct struttura s )
{
printf("I valori nella funzione sono: %d, %d\n", s.a, s.b);
return (0);
}

int main()
{

int pid[3], i = 0; char *cstack[3];

s.a = 2;
s.b = 4;

s1 = &s;
printf("Struttura: %d, %d\n", s.a, s.b);

for(i = 0; i < 3; i++)
{
cstack = (char*)malloc(2048);
pid = clone((void*)funz, cstack + 2048, CLONE_VM, s1);

}

return 0;
}
ma l'output che ne esce è stranissimo:
Struttura: 2, 4
I valori nella funzione sono: 134518488, 0
I valori nella funzione sono: 134518488, 0
I valori nella funzione sono: 134518488, 0

ma perche? Qualcuno saprebbe aiutarmi? Grazie!

Una premessa: lo stack standard bovettiano per un clone è di 4096 byte ossia un array di 1024 interi (per ogni clone) su una macchina che usa interi di 4 byte...
ossia è un int stack[1024];
per casi reali qualcuno obbietta che sono pochi, cmq non è questo il punto...

il tuo problema secondo me è che mentre la funzione che invochi dovrebbe essere definita come:

int clone_func(void *a)

tu fai una cosa strana: la funzione la dichiari come se dovesse farsi una copia locale della struttura (int funz( struct struttura s )), e poi le passi un puntatore alla variabile globale s....

PS: Mi hanno sconsigliato di castare il primo argomento della clone() (anche se negli esercizi di SO lo fanno spesso) e vietato di castare la malloc() in C...

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
17 Anni 2 Mesi fa #82857 da chiara sabbatella

ragazza scusate, sto scrivendo questo codice:

struct struttura
{
int a;
int b;
};

struct struttura s, *s1;

int funz( struct struttura s )
{
printf("I valori nella funzione sono: %d, %d\n", s.a, s.b);
return (0);
}

int main()
{

int pid[3], i = 0; char *cstack[3];

s.a = 2;
s.b = 4;

s1 = &s;
printf("Struttura: %d, %d\n", s.a, s.b);

for(i = 0; i < 3; i++)
{
cstack = (char*)malloc(2048);
pid = clone((void*)funz, cstack + 2048, CLONE_VM, s1);

}

return 0;
}
ma l'output che ne esce è stranissimo:
Struttura: 2, 4
I valori nella funzione sono: 134518488, 0
I valori nella funzione sono: 134518488, 0
I valori nella funzione sono: 134518488, 0

ma perche? Qualcuno saprebbe aiutarmi? Grazie!

Una premessa: lo stack standard bovettiano per un clone è di 4096 byte ossia un array di 1024 interi (per ogni clone) su una macchina che usa interi di 4 byte...
ossia è un int stack[1024];
per casi reali qualcuno obbietta che sono pochi, cmq non è questo il punto...

il tuo problema secondo me è che mentre la funzione che invochi dovrebbe essere definita come:

int clone_func(void *a)

tu fai una cosa strana: la funzione la dichiari come se dovesse farsi una copia locale della struttura (int funz( struct struttura s )), e poi le passi un puntatore alla variabile globale s....

PS: Mi hanno sconsigliato di castare il primo argomento della clone() (anche se negli esercizi di SO lo fanno spesso) e vietato di castare la malloc() in C...


Per cui mi stai dicendo che dovrei farla diventare cosi:

int funz( void *a )
{
(int)a;
printf( "%d", a->a );
}

Ora provo e ti faccio sapere! Grz 1000 cmq!

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
17 Anni 2 Mesi fa #82858 da chiara sabbatella
errata corrige no: (int)a, ma (int*)a

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
17 Anni 2 Mesi fa #82859 da chiara sabbatella

errata corrige no: (int)a, ma (int*)a


scusa, ho sbagliato d nuovo. Dovrebbe essere cosi?

int funz( void *p )
{
(struct struttura*)p;
printf( "%d", p->a );
}

A me cosi da errore anche se a occhio sembra corretto!

Si prega Accedi o Crea un account a partecipare alla conversazione.