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.
#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! |
Il codice ha due problemi: 1- quando esegui la seguente istruzione
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:
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. 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). 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. Ma no, ha sempre scritto nel file, solo che scriveva in binario e non in ascii leggibile. Ok grazie! C'è un modo per farlo scrivere in ASCII o farlo interpretare in maniera corretta ? Basta che usi fprintf ed fscanf se lo vuoi leggibile (cioè come normale file di testo).
5 su 6
mostra altri 1 commenti
|
Segui questa domanda
Via email:Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui
Via RSS:Basi di markdown
- *corsivo* o __corsivo__
- **grassetto** o __grassetto__
- collegamento:[testo](http://url.com/ "titolo")
- immagine?
- 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:
domanda posta: 26 Jul '15, 16:02
domanda visualizzata: 1,670 volte
ultimo aggiornamento: 28 Jul '15, 14:46