Ich schreibe ein Programm in C auf Linux, das ein Modul enthält, das das die Ausführung eines Shell-Befehls auf einem entfernten Rechner ermöglicht. Die einfachste Weg, den Befehl tatsächlich auszuführen, wäre natürlich einfach die system()-Funktion zu verwenden, oder popen und dann die Ausgabe. Ich habe mich jedoch aufgrund anderer Designanforderungen, die für das aktuelle Problem nicht relevant sind, für einen Ansatz auf niedrigerer Ebene entschieden Problem nicht relevant sind.
Ich richte also eine Pipe und einen Fork ein und rufe dann execl auf. Das alles funktioniert perfekt, bis auf eine ärgerliche Ausnahme. Es funktioniert nicht nicht richtig, wenn der auszuführende Shell-Befehl ein Daemon ist. In diesem Fall bleibt es einfach hängen. Ich kann nicht herausfinden, warum. Mein Verständnis ist dass sich ein Daemon beim Starten typischerweise gabelt und der übergeordnete Befehl beendet wird. Da meine Anwendung eine offene Pipe zum Parent hat, sollte der Aufruf read() fehlschlagen, wenn der Elternteil beendet wird. Aber stattdessen bleibt die Anwendung einfach hängen.
Hier ist ein einfacher Code, der das Problem reproduziert:
int main(int argc, char** argv)
{
// Create a pipe and fork
//
int fd[2];
int p = pipe(fd);
pid_t pid = fork();
if (pid > 0)
{
// Read from the pipe and output the result
//
close(fd[1]);
char buf[1024] = { 0 };
read(fd[0], buf, sizeof(buf));
printf("%s\n", buf);
// Wait for child to terminate
int status;
wait(&status);
}
else if (pid == 0)
{
// Redirect stdout and stderr to the pipe and execute the shell
// command
//
dup2(fd[1], STDOUT_FILENO);
dup2(fd[1], STDERR_FILENO);
close(fd[0]);
execl("/bin/sh", "sh", "-c", argv[1], 0);
}
}
Der Code funktioniert gut, wenn Sie ihn mit einem normalen Shell-Befehl verwenden. Aber wenn versuchen, einen Daemon auszuführen, bleibt er einfach hängen, anstatt zur Prompt zurück, wie es sein sollte.