fbpx
Skip to main content

[LA] Linux avanzato 2008

Di più
17 Anni 1 Mese fa #84297 da chiara sabbatella
Raga,
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
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • Visitatori
17 Anni 1 Mese fa #84299 da COM_EASYSOCIAL_GUEST_NAME
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){}
e 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!

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

Di più
17 Anni 1 Mese fa #84307 da chiara sabbatella
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;
}

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 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:
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
  • Avatar di COM_EASYSOCIAL_GUEST_NAME
  • Visitatori
  • 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!

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

Di più
17 Anni 1 Mese fa #84327 da chiara sabbatella

intanto hai un errore qui:
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! :)


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.