Anzeige:
Ergebnis 1 bis 8 von 8

Thema: programm aus C heraus aufrufen

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185

    programm aus C heraus aufrufen

    Hallo,
    ich schreibe gerade ein kleines panal-applet für gnome um den cisco vpn client zu starten/stoppen.

    Ich brauche also eine Möglichkeit ein Programm aus meinem C Programm heraus zu starten und wieder zu beenden. Zum starten könnte ich einfach system() verwenden, aber wie halte ich den vpn client dann wieder an? Es müsste irgendwas sein, wo ich in meinem C Programm das Programm auch wieder stoppen kann.

    Hat jemand einen Tip für mich?

    Danke!

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  2. #2
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    In der Qt Bibliothek gibt es für solche Sachen die Klasse QProcess: http://doc.trolltech.com/3.3/qprocess.html

    Vielleicht gibt es was ähnliches in der GTK-Bib?
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hi,

    das ruft ja förmlich nach dem klassischen fork, exec und kill Konstrukt.

    Infos:

    man 2 fork
    man 3 execlp
    man 2 kill

    Zuerst mit fork einen neuen Kindprozess öffnen, in diesem dann mit execlp (oder einer der Varianten von exec*) das Programm starten.
    Der Vaterprozess macht derweil was anderes, merkt sich aber die PID des Sohnes. Diese wird vom fork zurückgegeben.
    Soll der Sohnprozess beendet werden, schickt man ihm ein SIGTERM mittels kill und der gemerkten PID.
    Mit waitpid kann man nun auf des Ende des Sohnes warten.

    Gruß

    almoeli

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Wie benutzt du den denn? Und welchen überhaupt?

    Bei mir geht das mit vpnc so:
    vpnc-connect /etc/vpnc/epfl.conf
    vpnc-disconnect

    oder brauchst du etwa diese doofen Zertifikate die vpnc nicht kann und musst deshalb das proprietäre Cisco-Dingens benutzen?

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Hallo,
    ich habe es jetzt mal mit fork probiert, leider funktioniert es nicht so richtig.
    Zum test habe ich mal emacs starten lassen, damit man auf dem Bildschrim auch was sieht.
    Der Code sieht so aus:

    Code:
        connected = !connected;
        if (connected) {
            child_pid = fork();
            if (child_pid > 0)
                execlp("/usr/bin/emacs", "/tmp/test.txt", NULL);
    
            gtk_image_set_from_stock ((GtkImage*)data,
                                      GTK_STOCK_CONNECT,GTK_ICON_SIZE_MENU);
        } else {
            if (child_pid > 0)
                kill(child_pid, 9);
    
            gtk_image_set_from_stock ((GtkImage*)data,
                                      GTK_STOCK_DISCONNECT,GTK_ICON_SIZE_MENU);
        }
    child_pid ist als globaler int deklariert.
    es ist quasi ein Button der bei jedem Klick den Zustand wechseln soll (starten/beenden).
    Der neue Prozess wird jetzt gestartet und emacs auch. Aber bei einem zweiten klick auf den Button wird er nichtmehr beendet bzw. gekillt.

    Was mache ich falsch?

    Danke!

    @peschmae: ja, bei uns an der Uni funktioniert wlan mit vpn derzeit leider nur mit dem cisco-client. Ich habe aber gehört, dass auch an alternativen Lösungen gearbeitet wird, da der cisco Client nicht auf allen Systemen so richtig läuft.
    Auch den cisco-client kann man natürlich einfach in der Konsole starten, aber ich dachte so ein applet wäre ganz nett und ist die Gelegenheit mich mal mit der Programmierung von panal-applets zu beschäftigen.

    EDIT: Ich denke, dass es mit fork() und execlp() nicht geht, zumindest nicht so wie ich es gemacht habe. fork() erzeugt einen neuen Prozess und execlp() einen weiteren, beide sind aber voneinander unabhängig. Wenn ich also den child Porzess von fork() beende hat das keinen Einfluß auf den Prozess der mit execlp() erstellt wurde.
    Nur wie mache ich es dann? Damit bin ich wieder am Anfang.
    Geändert von BeS (27-04-2005 um 20:07 Uhr)

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Du machst das gerade verkehrt herum. Hier ein funktionierendes Codestück:

    Code:
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    pid_t child_pid;
    
    int main(void) {
        printf("start\n");
        getchar();
        child_pid = fork();
        printf("child_pid %d\n", child_pid);
        if (child_pid == 0)
            execlp("/usr/bin/emacs", "/tmp/test.txt", NULL);
        printf("end %d\n", child_pid);
        getchar();
        if (child_pid > 0)
            kill(child_pid, 9);
    }
    Fork geht so dass
    1) im Kindprozess die zurückgegebene pid 0 ist und
    2) im Elternprozess die zurückgegebene pid nicht 0, dafür aber die des Kindes ist

    Ähm. Das wars. Ich glaube eigentlich das wusstest du schon nur hast du das Programm nicht deinem wissen entsprechend geschrieben

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Zitat Zitat von peschmae
    Fork geht so dass
    1) im Kindprozess die zurückgegebene pid 0 ist und
    2) im Elternprozess die zurückgegebene pid nicht 0, dafür aber die des Kindes ist

    Ähm. Das wars. Ich glaube eigentlich das wusstest du schon nur hast du das Programm nicht deinem wissen entsprechend geschrieben
    ja, jetzt gehts, wirklich dummer Fehler von mir.

    Jetzt habe ich nur noch ein kleines Problem. Im Normalfall sollte sich der vpn client ja nicht von selber verabschieden, wenn es doch mal passiert, dann würde ich das aber im Programm gerne bemerken, so dass ich die Statusanzeige anpassen kann. Hast du eine Idee wie ich das erkennen kann?

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

  8. #8
    Registrierter Benutzer
    Registriert seit
    17.04.2002
    Beiträge
    185
    Zitat Zitat von BeS
    Im Normalfall sollte sich der vpn client ja nicht von selber verabschieden, wenn es doch mal passiert, dann würde ich das aber im Programm gerne bemerken
    hat sich jetzt auch erledigt, dafür kann man einen signal Handler einsetzen.

    Handler:
    Code:
    signal(SIGCHLD, vpnclient_died);
    und dann die Funktion:
    Code:
    void vpnclient_died(int signum)
    {
        ...
    }
    Damit ist das applet fertig und wird am Freitag in der Mittagspause getestet.
    Geändert von BeS (27-04-2005 um 22:47 Uhr)

    For a world where freedom and knowledge survives the compiler! (https://www.fsfe.org)

    If art interprets our dreams, the computer executes them in the guise of programs!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •