Abfrage des returns von system(..) aus einem anderen Prozess



  • Hallo zusammen, ich habe 2 Prozesse

    P1 und P2
    in P1 läuft per system(commando) gestartet ein programm

    Auszug aus manpage von system

    Return Value
    The value returned is -1 on error (e.g. fork() failed), and the return status of the command otherwise. This latter return status is in the format specified in wait(2). Thus, the exit code of the command will be WEXITSTATUS(status). In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127).

    ich würde gerne diesen returnwert abfragen und prozess 2 solange anhalten bis der returnwert von system an zeigt das ein befehl den ich übermittelt habe abgearbeitet ist.

    Meine frage wäre jetzt, wie kann ich diesen rückgabewert der in Prozess 1 ist von Prozess 2 aus abfragen ?



  • wenn proc 1 und proc 2 nicht verwandt sind, dann geht es nicht. Dann müsstest du IPC zwischen proc 1 und 2 machen.

    Kannst du dein Problem genauer erklären?



  • Ich verusche es mal etwas vereinfacht genauer zu erklären

    Schrittweise damit es nicht ganz so verwirrend ist

    Ich habe 2 Prozesse (P1 und P2) mittels fork im c programm erzeugt
    In P2 läuft ein beliebiges kommandozeilenorientieres progamm z.b sqlplus oder sh

    P1 bekommt Befehle die er per Pipe an P2 weiterleitet
    P2 Arbeitet den Befehl ab den er von 1 bekommt
    Beispiel :
    P1 sendet per pipe "ls" an P2 in dem eine Shell läuft

    Das nun folgende Problem :
    P1 soll solange warten bis P2 den befehl verarbeitet hat !

    bei ls ist das kein problem das würde per select(pipe....) gehen
    allerdings versagt select wenn es um befehle geht die keine rückgabe erzeugen, wie z.b chmod mkdir sleep ....
    das programm das in p2 läuft wird auch nicht beendet , daher kann mit wait() auch nicht überprüft werden ob der prozess beendet ist.

    Das konkrete problem ist also, wie merkt P1 das P2 den befehl der u.u keine Rückgabe liefert beendet hat.

    In P2 wird das Programm per exec oder system gestartet daher kann ich dort auch nichts spezieles zurückgeben, meine idee war jetzt den return von system irgendwie als "event" zu nutzen



  • Was auch immer du machen moechtest, ich wuerde es anders machen.

    In P2 wird das Programm per exec oder system gestartet daher kann ich dort auch nichts spezieles zurückgeben, meine idee war jetzt den return von system irgendwie als "event" zu nutze.

    Kansnt ja 'nen user defined signal an P1 schicken und dort einen Signalhandler installieren. Moeglichkeiten gibt es viele.



  • knivil schrieb:

    Was auch immer du machen moechtest, ich wuerde es anders machen.

    In P2 wird das Programm per exec oder system gestartet daher kann ich dort auch nichts spezieles zurückgeben, meine idee war jetzt den return von system irgendwie als "event" zu nutze.

    Kansnt ja 'nen user defined signal an P1 schicken und dort einen Signalhandler installieren. Moeglichkeiten gibt es viele.

    wie löse ich das user signal denn aus ? ich weiss ja nicht wann der befehl abgearbeitet ist um das singal auszulösen und wenn ich wüsste wann er abgearbeitet ist bräuchte ich das signal nicht, oder verstehe ich da etwas falsch, ich kenn mich mit singalen nicht gut aus, aber bedingung ist doch ein event an dem ich das ganze festmache und eben dieses fehlt mir hier, bzw ich weiss nicht wie ich aus einem kindprozess der nur aus folgendem besteht festmachen soll wann in dem fall sh den befehl der über pipeVtoK[0] kommt abgearbeitet hat. Wenn hierbei daten über pipeKtoV[1] rausgeht würden wäre select die lösung, das ist nur leider nicht immer der fall..

    dup2(pipeVtoK[0],0);    /* Stdout des Vaters = Stdin des Kindes */
      close(pipeVtoK[1]);        /* auf lesepipe wird nicht geschrieben */
    
      dup2(pipeKtoV[1],1); // ausgabe auf Vater umleiten
      dup2(pipeKtoV[1],2); // fehlerausgabe auf Vater umleiten
    
      close(pipeVtoK[0]); // auf schreibpipe wird nicht gelesen
    
      system("sh");
    


  • tallan schrieb:

    wie löse ich das user signal denn aus ?

    man: kill(2)



  • kill ist mir schon klar nur habe ich ja kein event wann und wo ich das machen muss, ich weiss einfach nicht wann der befehl abgearbeitet ist.

    system(progammname); bekommt einen befehl den es verarbeitet
    ich weiss nicht wie ich von einem anderen prozess aus sehen kann ob dieser befehl beendet ist.


Anmelden zum Antworten