Wie rufe ich execl() in C mit den richtigen Argumenten auf?

Lesezeit: 3 Minuten

Benutzer-Avatar
Matthias Morant

Ich habe vlc (Programm zum Reproduzieren von Videos), wenn ich in einer Shell eingebe:

/home/vlc “/home/meine Filme/der Film, den ich sehen möchte.mkv”

es öffnet sich und reproduziert den Film.

jedoch, wenn ich das folgende Programm ausführe:

#include <unistd.h>

int main(void) {

  execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);

  return 0;
}

vlc öffnet sich, reproduziert aber nichts. Wie kann ich das lösen?

Dinge, die ich versucht habe:

Ich vermutete

execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);

entsprach der Eingabe in die Shell:

/home/vlc /home/my movies/the movie i want to see.mkv

was nicht funktioniert, also habe ich es versucht

 execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL);

und vlc öffnet sich, reproduziert sich aber auch nicht.

Anstatt am Ende NULL zu schreiben, habe ich versucht, 0, (char*) 0, 1 …. nicht hilfreich. Hilfe!!!!

  • Warum hast du nicht geschaut errno nach dem fehlgeschlagenen execl? Das hätte dir mehr über dein Problem gesagt. Was ist aus dem sorgfältigen Lesen der Manpage für execl geworden? 🙂

    – Jens

    26. September 2012 um 7:53 Uhr


Benutzer-Avatar
Ein Programmierer

execl("/home/vlc", 
  "/home/vlc", "/home/my movies/the movie i want to see.mkv", 
  (char*) NULL);

Sie müssen alle Argumente angeben, einschließlich argv[0] die nicht aus der ausführbaren Datei stammt.

Stellen Sie auch sicher, das Finale NULL wird gecastet char*.

Einzelheiten sind hier: http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html

  • Warum muss /home/vlc zweimal angegeben werden?

    – LazerSharks

    17. Juli 2014 um 21:38 Uhr

  • Der erste ist der vollständige Pfad, der zweite der Prozessname, im Allgemeinen reicht “vlc” im zweiten Parameter

    – Tanguy

    27. Juli 2014 um 22:06 Uhr

  • Es sollte sein ... , (char*) NULL);

    – alk

    14. August 2016 um 11:40 Uhr

  • @alk, in der Tat. (Aber ich frage mich, wie viele aktuelle Implementierungen da draußen sind, die nicht mit einer nackten NULL funktionieren, da die Definition von NULL als (void*)0 oder 0L populär wurde, um das Fehlen von Cast auf NULL in der Praxis mit variadischen Funktionen funktionieren zu lassen; sogar Das Übergeben einer nackten 0 funktioniert auf den meisten, wenn nicht allen 32-Bit-ABI und, IIRC, einigen 64-Bit-ABIs, wie sie von Linux verwendet werden).

    – Ein Programmierer

    14. August 2016 um 12:34 Uhr

  • Falls NULL als 0 definiert ist und sizeof(char*) != sizeof(int)

    – Ein Programmierer

    19. Februar 2019 um 18:38 Uhr

Wenn Sie nur Ihren VLC-Wiedergabeprozess ausführen und Ihrem Anwendungsprozess erst dann die Kontrolle zurückgeben müssen, wenn er fertig ist, und nichts Komplexeres, dann können Sie wahrscheinlich nur Folgendes verwenden:

system("The same thing you type into console");

  • Zwischen der Behebung des kleinen Missverständnisses in den execl-Argumenten und dem Schreiben einer Funktion, die korrekt zitiert, damit die Shell das Zitat rückgängig machen kann, weiß ich, was ich bevorzuge.

    – Ein Programmierer

    26. September 2012 um 8:00 Uhr

  • Ich denke, ich verstehe Ihren Punkt und Ihre Präferenz ist vernünftig. Aber wenn es um so einfache Anforderungen geht, gibt es andere Vorteile der Verwendung von execl() anstelle von system(), abgesehen davon, dass man sich nicht mit Backslashes in der Escape-Sequenz in system() herumschlagen muss?

    – Erik Kaju

    26. September 2012 um 8:34 Uhr


  • Es könnte Sicherheitsgründe geben, wenn Sie z.B. einen String erstellt haben wie, sprintf(buf, "ls -la %s", var) mit denen Sie ausführen system(buf)jemand könnte Ihnen einen Dateinamen geben, "somefile; rm -rf ~"zum Beispiel.

    – Netzgräber

    29. Juli 2014 um 12:02 Uhr


1368240cookie-checkWie rufe ich execl() in C mit den richtigen Argumenten auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy