- Messaggi: 62
- Ringraziamenti ricevuti 0
[LA] Linux avanzato 2008
- chiara sabbatella
-
- Offline
- Senior Member
-
Riduci
Di più
17 Anni 1 Mese fa #84297
da chiara sabbatella
Risposta da chiara sabbatella al topic [LA] Linux avanzato 2008
Raga,
qualcuno mi saprebbe spiegare la sigaction() per favore, che dal man e da internet non è che ci abbia capito molto??
Grz 100000
qualcuno mi saprebbe spiegare la sigaction() per favore, che dal man e da internet non è che ci abbia capito molto??
Grz 100000
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
17 Anni 1 Mese fa #84299
da COM_EASYSOCIAL_GUEST_NAME
Per gli esercizi che danno a noi ti basta usarla così:
la devi usare con una struct sigaction per ogni segnale che vuoi intercettare. Le funzioni handler devi definirtele comee in genere al loro interno fai qualcosa come impostare il valore di una variabile globale (che deve essere di tipo volatile)..
per aspettare esplicitamente un segnale usi la pause() che blocca il processo fino a quando questo segnale non arriva (ovviamente se hai registrato 2 o + segnali il processo si sblocca al primo che arriva)...
Cmq vediti gli esercizi di sop che oltretutto sono molto simili a quelli che ha dato alle ultime 2 prove... ciao!
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic [LA] Linux avanzato 2008
Raga,
qualcuno mi saprebbe spiegare la sigaction() per favore, che dal man e da internet non è che ci abbia capito molto??
Grz 100000
Per gli esercizi che danno a noi ti basta usarla così:
struct sigaction saXXX={.sa_handler=tuaFunzioneHandlerDelSegnaleXXX};
sigaction (SIGXXX,&saXXX,NULL);la devi usare con una struct sigaction per ogni segnale che vuoi intercettare. Le funzioni handler devi definirtele come
void handlerXXX(int signo){}per aspettare esplicitamente un segnale usi la pause() che blocca il processo fino a quando questo segnale non arriva (ovviamente se hai registrato 2 o + segnali il processo si sblocca al primo che arriva)...
Cmq vediti gli esercizi di sop che oltretutto sono molto simili a quelli che ha dato alle ultime 2 prove... ciao!
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 1 Mese fa #84307
da chiara sabbatella
Risposta da chiara sabbatella al topic [LA] Linux avanzato 2008
Raga,
ho fatto un prog con la pipe: la clone crea due processi, uno scrive una stringa nella pipe e uno la legge. Solo che il processo che legge si blocca e non termina (o almeno questo pare dall'esecuzione)... qualc'uno mi sa dare una mano??
Ciao grz
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <assert.h>
#include <string.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int ppid = 0;
int pipefd[2];
char buff[1];
struct testo
{
char t[256];
};
void leggi( void *arg )
{
int r = 0;
// sleep(3);
while((r = read(pipefd[0], buff, 1)) > 0)
{
printf("leggo %c, %d\n", buff[0], r);
}
close(pipefd[0]);
}
void scrivi( void *arg )
{
char b[1024];
memset(b, '\0', 1024);
int w = 0, c = 0;
strcpy(b, ((struct testo*)(arg))->t);
close(pipefd[0]);
while( b[c] != '\t' )
{
w = write(pipefd[1], &b, 10);
c++;
}
close(pipefd[1]);
return;
}
int main()
{
struct testo t;
int status = 0, ppid = getppid();
strcpy(t.t, "caratteri da leggere\n\t");
printf("La stringa è %s\n", t.t);
int fd[2], *stack[2], w[2], i = 0;
pid_t cpid;
char buf;
if (pipe(pipefd) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}
stack[0] = (int*)malloc(2048);
stack[1] = (int*)malloc(2048);
fd[0] = clone((void*)leggi, (stack[0]+2048), CLONE_VM, NULL);
fd[1] = clone((void*)scrivi, (stack[1]+2048), CLONE_VM, &t);
w[1] = waitpid(fd[1], &status, __WCLONE);
w[0] = waitpid(fd[0], &status, __WCLONE);
printf("\n%d, %d\n", w[0], w[1]);
return 0;
}
ho fatto un prog con la pipe: la clone crea due processi, uno scrive una stringa nella pipe e uno la legge. Solo che il processo che legge si blocca e non termina (o almeno questo pare dall'esecuzione)... qualc'uno mi sa dare una mano??
Ciao grz
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <assert.h>
#include <string.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int ppid = 0;
int pipefd[2];
char buff[1];
struct testo
{
char t[256];
};
void leggi( void *arg )
{
int r = 0;
// sleep(3);
while((r = read(pipefd[0], buff, 1)) > 0)
{
printf("leggo %c, %d\n", buff[0], r);
}
close(pipefd[0]);
}
void scrivi( void *arg )
{
char b[1024];
memset(b, '\0', 1024);
int w = 0, c = 0;
strcpy(b, ((struct testo*)(arg))->t);
close(pipefd[0]);
while( b[c] != '\t' )
{
w = write(pipefd[1], &b, 10);
c++;
}
close(pipefd[1]);
return;
}
int main()
{
struct testo t;
int status = 0, ppid = getppid();
strcpy(t.t, "caratteri da leggere\n\t");
printf("La stringa è %s\n", t.t);
int fd[2], *stack[2], w[2], i = 0;
pid_t cpid;
char buf;
if (pipe(pipefd) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}
stack[0] = (int*)malloc(2048);
stack[1] = (int*)malloc(2048);
fd[0] = clone((void*)leggi, (stack[0]+2048), CLONE_VM, NULL);
fd[1] = clone((void*)scrivi, (stack[1]+2048), CLONE_VM, &t);
w[1] = waitpid(fd[1], &status, __WCLONE);
w[0] = waitpid(fd[0], &status, __WCLONE);
printf("\n%d, %d\n", w[0], w[1]);
return 0;
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
17 Anni 1 Mese fa #84313
da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic [LA] Linux avanzato 2008
intanto hai un errore qui:
lo cambierei in
il fatto che chi legge resti bloccato è normale visto che per le pipe la read è bloccante e se vuoi uscire da quel clone la condizione che hai messo non va bene (usa un char particolare, tipo 0, letto il quale fa una break;).
ciao e in bocca al lupo per oggi!
while( b[c] != '\t' )
{
w = write(pipefd[1], &b, 10);
c++;
}lo cambierei in
while( b[c] != '\t' )
{
w = write(pipefd[1], &b[c], 1);
c++;
}il fatto che chi legge resti bloccato è normale visto che per le pipe la read è bloccante e se vuoi uscire da quel clone la condizione che hai messo non va bene (usa un char particolare, tipo 0, letto il quale fa una break;).
ciao e in bocca al lupo per oggi!
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
17 Anni 1 Mese fa #84314
da COM_EASYSOCIAL_GUEST_NAME
Risposta da COM_EASYSOCIAL_GUEST_NAME al topic [LA] Linux avanzato 2008
RAGAZZI qualche anima pia che ha seguito il corso (specie le ultime 2 lezioni) o sostenuto l'esame potrebbe dirmi per favore come studiare le ultime 10 pagine della dispensa sull'inizializzazione? bisogna memorizzare tutte quelle funzioni e relativa spiegazione, vedere il codice associato, leggere i capitoli del libro indicati o altro?
GRAZIE 10000!
ciao!
GRAZIE 10000!
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 1 Mese fa #84327
da chiara sabbatella
Il problema, e non riesco a capirne il motivi sta qua:
while((r = read(pipefd[0], buff, 1)) != '\n')
{
printf("leggo %c, %d\n", buff[0], r);
}
in quella condizione > 0, non so perche mi ritorna sempre 1 anche quando la pipe è letta tutta (premetto che la stringa termina con uno \0 ma non credo sia quell il problema) mentre se faccio un numero di iterazioni predefinite, tipo 10, allora funziona! Perche?
Risposta da chiara sabbatella al topic [LA] Linux avanzato 2008
intanto hai un errore qui:
while( b[c] != '\t' ) { w = write(pipefd[1], &b, 10); c++; }
lo cambierei inwhile( b[c] != '\t' ) { w = write(pipefd[1], &b[c], 1); c++; }
il fatto che chi legge resti bloccato è normale visto che per le pipe la read è bloccante e se vuoi uscire da quel clone la condizione che hai messo non va bene (usa un char particolare, tipo 0, letto il quale fa una break;).
ciao e in bocca al lupo per oggi!
Il problema, e non riesco a capirne il motivi sta qua:
while((r = read(pipefd[0], buff, 1)) != '\n')
{
printf("leggo %c, %d\n", buff[0], r);
}
in quella condizione > 0, non so perche mi ritorna sempre 1 anche quando la pipe è letta tutta (premetto che la stringa termina con uno \0 ma non credo sia quell il problema) mentre se faccio un numero di iterazioni predefinite, tipo 10, allora funziona! Perche?
Si prega Accedi o Crea un account a partecipare alla conversazione.