C Programm : Vaterprozess liest Daten ein - Kind führt diese aus



  • Hallo zusammen ich Arbeite mich grade in IPC ein und stehe vor folgendem Problem.

    Mein Programm soll einen Kindprozess erzeugen der Beispielsweise eine Shell (sh) ausführt, von Vater möchte ich nun befehle wie beispielsweise "ls" an das kind senden, diesen dort ausführen lassen und das ergebnis an den Vater zurückliefern.

    Da ich mich erst in IPC eingearbeitet habe sind meine kenntnise noch sehr schlecht, ein erstes programm das zumindest die Kommunikation beider Prozess realisiert habe ich hinbekommen

    int main (){
       int pid, j, i;
       int pfds[2];
       pipe(pfds);
       char buf[30];
    
       int once = 0;
       pid = fork();
    
       if (pid == 0)
       {
    
          /* Kindprozess
           * wenn fork eine 0 zurückgibt, befinden wir uns im Kindprozess
           */
          for (j=0; j < 10; j++)
          {
        	  printf ("Kindprozess:  %d (PID: %d)\n", j, getpid());
        	  write(pfds[1], "test", 5);
            sleep (1);
          }
          exit (0);
       }
       else if (pid > 0)
       {
          /* Vaterprozess
           * Gibt fork einen Wert größer 0 zurück, so ist dies die PID des Kindprozesses
           */
          for (i=0; i < 10; i++)
          {
             printf ("Vaterprozess: %d (PID: %d)\n", i, getpid());
             read(pfds[0], buf, 5);
             printf("PARENT: read \"%s\"\n", buf);
    
             sleep (1);
          }
       }
       else
       {
          /* Wird ein negativer Wert zurückgegeben, ist ein Fehler aufgetreten */
          fprintf (stderr, "Error");
          exit (1);
       }
       return 0;
    }
    

    Hier wird ein Prozess schlafen geschickt und so der andere aktiv, das problem was ich nun konkret habe ist folgendes :

    Wie schaffe ich es das die shell in standby geht bis sie vom vater einen befehl erhält diesen verarbeitet ( auch asynchron z.b kommando mit sleep ) und dann wieder auf die eingabe des vaters wartet, ein umschalten mit sleep ist hier ja nicht möglich.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • tallan schrieb:

    Wie schaffe ich es das die shell in standby geht

    was meinst du damit genau?



  • ich denke, der threadersteller will die shell einmal starten und wie in der konsole befehle übergeben. normalerweise wird eine shell das nicht tun, da sie zuerst prüft, ob ihr stdin ein tty ist oder nicht. wenn du die shell startest und stdin auf eine pipe umbiegst, ist das natürlich nicht der fall. deshalb musst du zb. bei der bash die option -i für interactive beim start angeben.
    damit du dann auch die ausgaben der programm lesen kannst, die die shell für dich ausführt, musst du auch stdout umbiegen. bedenke aber, dass die shell dann versuchen wird, dorthin auch ihren prompt zu schreiben. deshalb solltest du die shell variable PS1 auf den leeren string setzen, bevor du den ersten befehl ausführst.



  • ich beschrieb es vielleicht nochmal etwas genauer,

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    
    int main (){
       int pid;
       int pfds[2];
       pipe(pfds);
       char buf[30];
    
       pid = fork();
    
       if (pid > 0)
       {
    
             printf ("Vaterprozess: (PID: %d)\n", getpid());
             write(pfds[1], "test", 5);
    
             sleep(1);
    
       }else    if (pid == 0)
       {
    
    				 // starten von sqlplus
    
        	  printf ("Kindprozess:  (PID: %d)\n", getpid());
        	  read(pfds[0], buf, 5);
        	  printf("Kind: read \"%s\"\n", buf);
    
        	  // buf  ( gelesener befehl ) an sql geben und ausführen
        	  // rückgabe von sql an den parent schreiben
    
       }
       else
       {
    
          fprintf (stderr, "Error");
          exit (1);
       }
       return 0;
    }
    

    ich möchte also im kind eine shell oder sqlplus ( irgendetwas kommandozeilen orientiertes) starten dem ich per parent befehle gebe.
    wenn ich jetzt aber z.b per system("sh"); im kind starte wird meine kommandozeile zur sh ( was ich nicht will ) ich will sie aber passiv ansteuern

    daher würde ich gerne wissen wie ich sqlplus oder sh, bash... im kind starten kann und sie quasi in den standby schicke damit der vaterprozess weiterarbeiten kann und so befehle an das kind schickt, das dann wieder aktiv wird diese bearbeitet und die rückgabe an den vater liefert.



  • du musst selbst fork und exec verwenden. system kann dir das nicht bieten. popen könnte es. es wäre aber doppelt gemoppelt, da popen in dem fall die shell verwendet, um eine shell zu starten. sollte aber klappen. zumindest seh ich keinen grund, wieso nicht.

    wichtig bei all dem ist aber, dass das aufzurufende programm das unterstützt. was du willst, ist eine interaktive session mit einem prozess. normalerweise klappt das nur mit einem user an einer konsole. die bash kann das mit option -i. sqlplus kenn ich nicht.


Anmelden zum Antworten