PDA

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

VICIUS
11-01-2006, 23:42
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

VICIUS
12-01-2006, 00:17
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);
}

VICIUS
12-01-2006, 00:27
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:

VICIUS
12-01-2006, 12:14
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.

andbin
13-01-2006, 21:28
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!