|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
[Unix] Scartare in /dev/null l'output di un programma
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: Quote:
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
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
dovrebbe funzionare.
Codice:
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));
ciao |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
che cacchio ci fai in giro a quest'ora??
Grazie, domani provo Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Codice:
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);
}
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
__________________
GPU Compiler Engineer |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Prova a redirigere anche stderr.
EDIT: non va perchè sono deficente. I parametri sono invertiti ciao |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Non funza manco con stderr . Non riesco a capire. Sto sbagliando qualcosa io?? Codice:
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);
}
__________________
GPU Compiler Engineer |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Non va manco invertendo cacchio!!
E poi sei sicuro che dovrebbero essere invertiti? A me leggendo il man di dup2 mi sembra + giusto com'erano prima
__________________
GPU Compiler Engineer |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Ci riprovo.
Codice:
#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);
}
}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
A quanto ho capito "dup" funziona solo se il filedescriptor è aperto da "open()" e non da "fopen()" ...
Almeno per quanto ci ho capito.
__________________
GPU Compiler Engineer |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#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;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:22.


















