Buongiorno! Sto cercando di far comunicare due processi, padre e figlio, utilizzando la system call signal(). In particolare il primo processo deve scrivere su file ciò che l'utente digita da shell. Il secondo processo deve invece leggere ciò che è stato scritto.
I processi si alternano in maniera corretta, però non viene scritto niente sul file e di conseguenza il secondo processo non legge nulla.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>

void user() {
    return; 
}
int main(int argc, char**argv) {
    signal(SIGUSR1, user);
    signal(SIGUSR2, user);
    char parola[20];
    int fr, rr; 
    int fp; 
    fp = open(argv[1], O_WRONLY, S_IRUSR | S_IWUSR); 
    fr = open(argv[1], O_RDONLY);
    if(argc != 2) {
        fprintf(stdout,"Errore file.\n");
        exit(-1);
    }
    pid_t pid; 
    if((pid =fork())>0 ) {
        while(1) {
        sleep(2);
        fprintf(stdout,"Inserisci una parola\n"); 
        scanf("%s", parola);
        write(fp, parola, 20);  
        // segnale
        kill(pid, SIGUSR1);
        pause();
        }
    }
    else {
        while(1) {
        pause();

        while((rr = read(fr, parola, 20))>0) {
            fprintf(stdout, "%s ", parola);
        } 
        kill(getppid(), SIGUSR2);
        }
    }   
    return 0; 
}
<quote>

Non capisco dove sia sbagliata la scrittura.. Ho provato anche con l'fprintf utilizzando un FILE*, ma nuovamente il file non viene modificato. Grazie!

chiesto 26 Lug '15, 16:02

Strcmp_01's gravatar image

Strcmp_01
451711


Il codice ha due problemi:

1- quando esegui la seguente istruzione

while((rr = read(fr, parola, 20))>0)

significa che hai già letto la parola dal file e deve essere eliminata, altrimenti nelle esecuzioni successive del programma verranno ristampate le stesse parole;

2- dopo la stampa sull'stdout devi mettere questo per forzare l'output a video:

fflush(stdout);

coll. permanente

ha risposto 27 Lug '15, 17:28

dslul's gravatar image

dslul
9631416

modificato 27 Lug '15, 17:29

Ho aggiunto fflush dopo la stampa, però non viene stampata la parola. All'interno di entrambi i cicli while(1) ho chiuso il file che avevo poco aperto subito prima, e cosi prende la prima parola. Al secondo input però si blocca.
Forse è dovuto al primo errore che mi hai segnalato, che però non ho capito come risolvere. Come ho scritto non viene scritto all'interno di parola ciò che viene letto da read? Non sono molto pratico di file binari e non ho ben capito come funzionano le system call relative.

(27 Lug '15, 17:52) Strcmp_01 Strcmp_01's gravatar image

Sì è dovuto al primo problema, per verificare usa un file nuovo vuoto per il trasferimento delle stringhe tra processi, vedrai che al primo avvio del programma funziona, ai successivi no (perché sono memorizzate ancora le stringhe della vecchia esecuzione). In pratica potresti aggiungere O_TRUNC tra i parametri della open in modo da riscrivere sempre il file (come fa la fopen in scrittura).

(27 Lug '15, 18:07) dslul dslul's gravatar image

Ok adesso scrive qualcosa nel file! Però viene scritto in cinese.. Molto probabilmente sbaglio a scrivere o lo interpreta male, perchè nell'icona si legge l'inizio della parola digitata.

(27 Lug '15, 18:42) Strcmp_01 Strcmp_01's gravatar image

Ma no, ha sempre scritto nel file, solo che scriveva in binario e non in ascii leggibile.

(27 Lug '15, 18:57) dslul dslul's gravatar image

Ok grazie! C'è un modo per farlo scrivere in ASCII o farlo interpretare in maniera corretta ?

(28 Lug '15, 07:20) Strcmp_01 Strcmp_01's gravatar image

Basta che usi fprintf ed fscanf se lo vuoi leggibile (cioè come normale file di testo).

(28 Lug '15, 14:46) dslul dslul's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×63
×5

domanda posta: 26 Lug '15, 16:02

domanda visualizzata: 655 volte

ultimo aggiornamento: 28 Lug '15, 14:46

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.