Aus C-App unabhängige Anwendung starten
-
Moin!
Ich versuche mir gerade eine Zusatzfunktion für ein Programm namens "Xournal" zu schreiben (damit kann man per Tablet handschriftliche Notizen machen).
Es geht um einen virtuellen PDF-Drucker (CUPS-PDF), dessen Code ich so verändert habe, dass er nach dem "Drucken" Xournal mit dem PDF öffnet, so dass man es dann per Hand beschreiben kann.
Nachdem Xournal mit dem PDF geöffnet wurde, steht das entsprechende Dokument solange in der Warteschlange meines Xournal-Druckers, bis ich das Dokument schließe.
Konkret:
Mein C-Programm führt Xournal aus und beendet sich erst, wenn Xournal beendet wurde.Mein Wunsch:
Das C-Programm führt Xournal aus und beendet sich, Xournal läuft weiter.Hier der Code:
char *xournalpath; xournalpath="/usr/bin/xournal"; execlp (xournalpath, "xournal", outfile);
Das ist bestimmt so ein ultraleichtes Ding. Leider aber kann eigentlich gar kein C und habe diesen Codeschnipsel durch Copy&Paste mit Tutorials zusammengeflickt
. Aber jetzt komm ich nicht mehr weiter...
Ich habe online irgendwas gelesen von fork() in Verbindung mit exec, hab aber null Plan davon...
Würde mich freuen wenn mir jemand weiterhelfen könnte.
Danke schonmal für hoffentlich zahlreiche Antworten :).Gruß
oroberosP.S: Da es ein solches Feature für Xournal bislang noch nicht gibt, würde ich das, was mit eurer Hilfe dabei rauskommt unter der GPL zum Download bereitstellen. Eure Namen würden natürlich im Code mitverewigt :-).
-
tja execlp ersetzt den aktuellen prozess durch den neuen.
kein wunder also wenn du erst dein xournal beenden musst.nimm also fork()/exec() oder zur not halt system()
lies mal hier wie das geht:
http://pronix.linuxdelta.de/C/LinuxprogrammierungLinuxsystemprogrammieren_C_Kurs_Kapitel2.shtml#2_2
-
Danke schonmal für den Link!
Ich habe mit diesen Infos ein kleines Programm schreiben können, welches genau das macht was ich will.
Leider funktioniert das nicht mehr wenn ich den Code in das Drucker-Backend einfüge.Hier ist der Code:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char **argv) { pid_t kind1; switch(kind1=fork()) { case -1 : break; case 0 : execlp ("/home/gerhard/Desktop/test", "xournal start script", outfile, "gerhard"); default : exit(0); } }
Als einzelnes Programm gestartet wird zuerst xournal ausgeführt und dann das Programm beendet. Das kann ich am Befehl "ps x | grep programmname" erkennen.
Das Druckerprogramm macht mit dem Code anscheinend nicht dasselbe. Hier ist dessen Quellcode: http://home.in.tum.de/~hagerer/cups-pdf.c
Der Code ist ganz unten eingesetzt.Weiß jemand weiter?
-
Ich wollte noch anfügen:
Der veränderte Drucker-Quellcode verursacht dasselbe Problem wie ich oben beschrieben habe.
D.h. das Dokument bleibt in der Warteschlange solange bis es geschlossen wird.
Oder anders gesagt: Das C-Programm führt xournal aus und schließt sich nach xournal.
Das Problem bleibt also wie davor, obwohl der eingefügte Code an und für sich das Problem löst...
-
Ich habe das Problem gelöst!
Hier der Code-Schnipsel:
pid_t kind1; switch(kind1=fork()) { case -1 : exit(0); case 0 : execlp ("/usr/bin/xournal_print", "xournal start script", outfile, argv[2]); default : execlp("cancel","Enqueue xournal print job",argv[1]); }
Durch "cancel" wird der Druckprozess einfach aus der Queue entfernt.
Danke für die Hilfestellung!
-
wenn du execlp benutzt, dann musst die Argumenteliste mit einem NULL Pointer abgeschlossen werden (sonst kann die execlp-Ellipse nie wissen, wie viele Parameter vorhanden sind).