Ich muss eine Funktion erstellen, die unter anderem einen untergeordneten Prozess hervorbringt. Ich möchte dieser Funktion eine optionale Liste von Dateidekriptoren übergeben, damit je nach den Bedürfnissen des Benutzers die Eingabe/Ausgabe des untergeordneten Prozesses umgeleitet werden kann.Redirect gabeled Prozessausgabe zu NULL
Ich habe Dutzende von Menschen gesehen zu reden, wie dies mit dup2
etwas wie dies zu tun:
if(pid < 0) // error forking.
{
//...
}
else if(pid != 0) // Parent process.
{
ret = waitpid(pid, &status, 0);
return WEXITSTATUS(status);
}
else // Child process.
{
dup2(fd, STDIN_FILENO); // Clone passed file discriptor.
close(fd); // Close the passed one, since we have already cloned.
execvp(arglist[ 0 ], arglist);
}
In Ordnung. All das ist im Internet. Meine Frage ist jetzt, wie (oder was ist der beste Weg), um auf /dev/null
umzuleiten?
Sollte ich den Benutzer zwingen, open(/dev/null)
und übergeben Sie es als fd
oder gibt es einen besseren Weg?
EDIT:
Dies, wie ich wollte nicht so schön ist, aber ich konnte einen besseren Weg nicht finden, so dass ich beenden eine Reihe von Dateinamen nach oben vorbei, wo immer ein Benutzer umleiten möchten könnte, jeweils STDIN, STDOUT und STDERR:
static int do_exec(arglist_t arglist, const char *fio[ 3 ])
{
DEBUG__(OSU_DEBUG_LEVEL_1, "fio = %p\n", fio);
if (fio)
{
if (fio[ STDIN_FILENO ])
{
int fd = open(fio[ STDIN_FILENO ], O_RDONLY);
if (-1 < fd)
{
dup2(fd, STDIN_FILENO);
close(fd);
}
}
if (fio[ STDOUT_FILENO ])
{
int fd = open(fio[ STDOUT_FILENO ], O_WRONLY | O_CREAT | O_APPEND);
if (-1 < fd)
{
dup2(fd, STDOUT_FILENO);
close(fd);
}
}
if (fio[ STDERR_FILENO ])
{
int fd = open(fio[ STDERR_FILENO ], O_WRONLY | O_CREAT | O_APPEND);
if (-1 < fd)
{
dup2(fd, STDERR_FILENO);
close(fd);
}
}
}
return execvp(arglist[ 0 ], arglist);
}
- ich habe es noch nicht vollständig getestet, so dass es einige Fehler haben kann.
Wirklich dank @Zack und @gbulmer.
Ich weiß, das wird funktionieren, aber frage mich, ob es eine bessere Möglichkeit ist, das zu tun. Ich könnte Dateinamen wie @ gbulmer unten vorgeschlagen verwenden, testen Sie die Zeichenfolgen für NULL und lassen Sie meine API die Verantwortung für das Öffnen. Dies funktioniert auch und ohne Einschränkungen für jede Datei, aber wird mir noch einen Geschmack geben, dass es ein besserer Weg sein muss. Wirklich danke! – j4x
Wie sieht ein "besserer Weg" für Sie aus? – zwol
Ich würde gerne eine Lösung sehen, wo ich Parameter nicht explizit testen musste, Datei nach Name usw. öffnen, aber ich denke, dass es nicht möglich sein wird, also gebe ich auf. Ich werde tun, was Sie vorschlagen (siehe meine Bearbeitung). Vielen Dank! – j4x