- Messaggi: 62
- Ringraziamenti ricevuti 0
[LA] Linux avanzato 2008
- COM_EASYSOCIAL_GUEST_NAME
-
- 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
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...
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.
- chiara sabbatella
-
- Offline
- Senior Member
-
Riduci
Di più
17 Anni 2 Mesi fa #82853
da chiara sabbatella
Risposta da chiara sabbatella 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!
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
-
- Visitatori
-
17 Anni 2 Mesi fa #82856
da COM_EASYSOCIAL_GUEST_NAME
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...
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic [LA] Linux avanzato 2008
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...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!
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.
- chiara sabbatella
-
- Offline
- Senior Member
-
Riduci
Di più
- Messaggi: 62
- Ringraziamenti ricevuti 0
17 Anni 2 Mesi fa #82857
da chiara sabbatella
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!
Risposta da chiara sabbatella al topic [LA] Linux avanzato 2008
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...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!
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.
- chiara sabbatella
-
- Offline
- Senior Member
-
Riduci
Di più
- Messaggi: 62
- Ringraziamenti ricevuti 0
17 Anni 2 Mesi fa #82858
da chiara sabbatella
Risposta da chiara sabbatella al topic [LA] Linux avanzato 2008
errata corrige no: (int)a, ma (int*)a
Si prega Accedi o Crea un account a partecipare alla conversazione.
- chiara sabbatella
-
- Offline
- Senior Member
-
Riduci
Di più
- Messaggi: 62
- Ringraziamenti ricevuti 0
17 Anni 2 Mesi fa #82859
da chiara sabbatella
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!
Risposta da chiara sabbatella al topic [LA] Linux avanzato 2008
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.