PDA

View Full Version : [C] collegare stdin con /dev/null ???


trunks81
03-03-2005, 12:15
Ciao ragazzi!
Vi chiedo una cosa:
mi si chiede che lo stdin sia connesso con /dev/null, lo stdout con un file in /tmp/ e lo stderr con un altro file in /tmp/.

Con gli ultimi due, sono riuscito perchè basta creare due pipe con nome e il gioco è fatto, ma come si fa a collegare lo stdin con /dev/null??
cos'è /dev/null???

Spero mi potete aiutare.
grazie!

ilsensine
03-03-2005, 12:19
Con gli ultimi due, sono riuscito perchè basta creare due pipe con nome e il gioco è fatto
Perché due pipe? Basta eseguire il programma con
./programma 1>/tmp/file1 2>/tmp/file2

Aggingi anche 0</dev/null e il gioco è fatto.

VICIUS
03-03-2005, 12:32
apri i file che ti interessano poi usa dup/dup2 cosi rimpiazzi i file descriptor.

ciao ;)

trunks81
03-03-2005, 13:59
Originariamente inviato da VICIUS
apri i file che ti interessano poi usa dup/dup2 cosi rimpiazzi i file descriptor.
ciao ;)

infatti io faccio così:

IFFERROR(fdpipe=open "/dev/null",O_WRONLY|O_CREAT|O_NONBLOCK), "aprendo pipe /dev/null");
dup2(fdpipe,STDIN);
close(fdpipe);

In compilazione non mi da errori, però quando lancio il programma principale e scrivo qualcosa con la tastiera non fa niente (e qui sembrerebbe funzionare), però quando termina il programma di log di quello principale, sul video vedo tutte le cose scritte prima.

cioè il funzionamento di collegare l'STDIN a /dev/null non dovrebbe essere che qualunque cosa inserisca, durante l'esecuzione del programma, è come se non esistesse??

vi ringrazio!

ilsensine
03-03-2005, 14:25
Originariamente inviato da trunks81
In compilazione non mi da errori, però quando lancio il programma principale e scrivo qualcosa con la tastiera non fa niente (e qui sembrerebbe funzionare), però quando termina il programma di log di quello principale, sul video vedo tutte le cose scritte prima.

Ragionevole che faccia così. Non hai "ucciso" stdin, hai solo evitato che il tuo programma possa leggerci. Quello che scrivi finisce sempre sullo stream di input della console corrente; appena il programma termina, bash legge quello che ci trova dentro.

trunks81
03-03-2005, 14:47
Originariamente inviato da ilsensine
Ragionevole che faccia così. Non hai "ucciso" stdin, hai solo evitato che il tuo programma possa leggerci. Quello che scrivi finisce sempre sullo stream di input della console corrente; appena il programma termina, bash legge quello che ci trova dentro.


e come devo fare??
:mc: :mc:

VICIUS
03-03-2005, 14:57
Originariamente inviato da trunks81
e come devo fare??
:mc: :mc:
potresti aprire stdin poco prima di uscire e svuotare tutto il buffer.

ciao ;)

ilsensine
03-03-2005, 16:36
Originariamente inviato da trunks81
e come devo fare??
:mc: :mc:
Nulla, il comportamento è quello corretto.

trunks81
03-03-2005, 16:55
Originariamente inviato da ilsensine
Nulla, il comportamento è quello corretto.

ma non sarebbe corretto se alla fine del secondo programma, invece di stamparmi tutte quelle cose che ho digitato senza senso, non me le facesse vedere??

come si svuota il buffer?

ilsensine
04-03-2005, 08:29
Originariamente inviato da trunks81
ma non sarebbe corretto se alla fine del secondo programma, invece di stamparmi tutte quelle cose che ho digitato senza senso, non me le facesse vedere??

Allora non devi "chiudere" stdin ma anzi il tuo stesso programma deve curarsi di svuotarne il contenuto.
Credevo che la tua richiesta si riferisse alla necessità di alcuni programmi, per motivi di sicurezza, di scollegarsi dal canale di input.

trunks81
04-03-2005, 09:31
Originariamente inviato da ilsensine
Allora non devi "chiudere" stdin ma anzi il tuo stesso programma deve curarsi di svuotarne il contenuto.
Credevo che la tua richiesta si riferisse alla necessità di alcuni programmi, per motivi di sicurezza, di scollegarsi dal canale di input.

Grazie per le risposte.
Essendo un neofita del C vi chiedo di postarmi il codice che posso usare per svuotare il buffer.

:rolleyes: :rolleyes:

ilsensine
04-03-2005, 10:09
Originariamente inviato da trunks81
Grazie per le risposte.
Essendo un neofita del C vi chiedo di postarmi il codice che posso usare per svuotare il buffer.

:rolleyes: :rolleyes:
Non mi sembra che esistano nello standard c. Sotto linux puoi usare le termios:

#include <stdlib.h>
#include <stdio.h>
#include <termios.h>

int main(void) {
struct termios ios;
struct termios old_ios;
tcgetattr(fileno(stdin), &ios);
/* Salva le vecchie impostazioni. Vanno ripristinate prima di terminare il programma. */
old_ios = ios;
/* Disabilita modalita' canonica (line-buffered) e l'echo dei caratteri */
ios.c_lflag &= ~(ICANON|ECHO);
tcsetattr(fileno(stdin), TCSANOW, &ios);

/*
* Qui va messo il corpo del programma
*/

/* Eliminazione dei caratteri pendenti in coda */
tcflush(fileno(stdin), TCIFLUSH);
/* Ripristina le vecchie impostazioni */
tcsetattr(fileno(stdin), 0, &old_ios);
return 0;
}

Ovviamente stdin non è collegato a /dev/null, altrimenti non puoi fare il flush. Se è un requisito di progetto, occorre fare una piccola variazione.