View Full Version : [Unix] Scartare in /dev/null l'output di un programma
AnonimoVeneziano
11-01-2006, 23:28
Ciao, sto lavorando un po' con le funzioni UNIX per la esecuzione di programmi da un programma (come execve() e le altre relative).
Mi trovo però davanti a un problema, gradirei infatti che tutto l'output del programma che lancio dal mio venga o rediretto a /dev/null o in un buffer ad esempio, solo che non so come fare e cercando su internet non ho cavato un ragno dal buco.
Il codice che avvia il programma è questo:
extern char **environ;
int pID = fork();
if (pID == 0)
{
execvp(executable, Arguments);
exit(1);
}
Chiaramente "executable" e "Arguments" sono rispettivamente un array di caratteri e un array di array di caratteri opportunamente inizializzati.
Il programma che viene chiamato mi butta fuori un sacco di output in console , mentre io vorrei che il mio utente non venisse turbato dall' output in console mentre giochicchia con la GUI.
Come si fa a fare ciò che ho chiesto ?
Grazie dell' aiuto
Ciao
dovrebbe funzionare.
int devnull_fd = fopen("/dev/null", O_WRONLY);
if (devnull_fd < 1) {
perror("non sono riuscito ad aprire /dev/null");
exit (-EKABOOM);
}
dup2 (devnull_fd, fileno(stdout));
devi metterlo prima della exec
ciao ;)
AnonimoVeneziano
11-01-2006, 23:59
che cacchio ci fai in giro a quest'ora?? :D
Grazie, domani provo :D
Ciao
AnonimoVeneziano
12-01-2006, 00:07
extern char **environ;
int pID = fork();
if (pID == 0)
{
int devnull_fd = (int) fopen("/dev/null", "wb");
if (devnull_fd < 1) {
perror("non sono riuscito ad aprire /dev/null");
exit (-1);
}
dup2 (devnull_fd, (int) fileno(stdout));
execvp(executable, Arguments);
exit(1);
}
Non funziona :(
Tra l'altro ho dovuto castare a "int" l'output di fopen() e fileno() perchè il controllo dei tipi in C++ non permette la conversione da "FILE*" a "int", comunque in runtime l'output di "mencoder" me lo trovo ancora tutto sulla console :(
Ciao
Prova a redirigere anche stderr. :)
EDIT: non va perchè sono deficente. I parametri sono invertiti :p
ciao ;)
AnonimoVeneziano
12-01-2006, 00:22
:muro: :muro:
Non funza manco con stderr .
Non riesco a capire.
Sto sbagliando qualcosa io??
extern char **environ;
int pID = fork();
if (pID == 0)
{
int devnull_fd = (int) fopen("/dev/null", "wb");
if (devnull_fd < 1) {
perror("non sono riuscito ad aprire /dev/null");
exit (-1);
}
dup2 (devnull_fd, (int) fileno(stdout) );
dup2 (devnull_fd, (int) fileno(stderr) );
execvp(executable, Arguments);
exit(1);
}
Prova a redirigere anche stderr. :)
EDIT: non va perchè sono deficente. I parametri sono invertiti :p
ciao ;)
Leggi bene l'edit :D
ciao ;)
AnonimoVeneziano
12-01-2006, 00:31
Non va manco invertendo cacchio!! :cry: :cry:
E poi sei sicuro che dovrebbero essere invertiti? A me leggendo il man di dup2 mi sembra + giusto com'erano prima :mbe:
Ci riprovo. :D Questo funziona. Vedi se ne ricavi qualcosa. Io purtroppo non scrivo piu roba in C da molto tempo e non ricordo se ci sono delle regoline per le varie execXX.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main (int argc, char *argv[])
{
const char *mencoder = "/usr/bin/mencoder";
const char *mencoder_argv[] = {
"mencoder", "dvd://",
"-ovc", "lavc",
"-oac", "mp3lame",
"-lavcopts", "vcodec=mpeg4:vbitrate=700",
"-lameopts", "abr:br=128",
"-o", "prova.avi",
NULL
};
int pid = fork();
if (pid == 0) {
int stdout_fd = open("/tmp/stdout.txt", O_WRONLY | O_CREAT);
int stderr_fd = open("/tmp/stderr.txt", O_WRONLY | O_CREAT);
dup2(stdout_fd, fileno(stdout));
dup2(stderr_fd, fileno(stderr));
execv(mencoder, mencoder_argv);
} else {
exit(0);
}
}
ciao ;)
AnonimoVeneziano
12-01-2006, 19:11
A quanto ho capito "dup" funziona solo se il filedescriptor è aperto da "open()" e non da "fopen()" ...
Almeno per quanto ci ho capito.
A quanto ho capito "dup" funziona solo se il filedescriptor è aperto da "open()" e non da "fopen()" ...
Almeno per quanto ci ho capito.
Ciao, prova questo:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main (void)
{
int fdnull;
fdnull = open ("/dev/null", O_WRONLY);
if (fdnull == -1)
{
printf ("Errore open\n");
return 1;
}
dup2 (fdnull, STDOUT_FILENO); /* Stdout --> /dev/null */
dup2 (fdnull, STDERR_FILENO); /* Stderr --> /dev/null */
close (fdnull);
fprintf (stdout, "Sto scrivendo su stdout!\n");
fprintf (stderr, "Sto scrivendo su stderr!\n");
return 0;
}Vedrai che non stampa più nulla!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.