2016-10-06 3 views
0

Ich schreibe eine Aufgabe, die ein anderes Programm printf() interpositionieren. Es forks ein Kind Prozess und und leiten alle die Ausgabe des Programms auf den Kind-Prozess. Der Code unten ist was ich geschrieben habe, was noch nicht gelaufen ist und ich muss diese Funktion hinzufügen, denke ich.Wie verzweigen Sie einen Child-Prozess und leiten Sie alle Ausgaben des Programms an den Child-Prozess um?

int printf(char* format, ...) 
{ 
    int res; 
    static void *(*mallocp)(size_t size); 
    char *error; 
    if (!mallocp) { 
    mallocp = dlsym(RTLD_NEXT, "printf"); 
     if ((error = dlerror()) != NULL) { 
      fputs(error, stderr); 
      exit(1); 
     } 
    } 
    va_list args; 
    va_start(args, format); 
    res=mallocp(format, args); 
    va_end(args); 
    return res; 
} 

Ich finde eine ähnliche Lösung, aber ein wenig anders. Redirect stdin and stdout in child in c Ich weiß es nicht wirklich, nachdem ich einen Kindprozess abzweigen und Pipe gut konfigurieren, wie kann ich Elternprozesse mit dem System "printf" mallocp weitermachen lassen, um den stdout zu geben, der zum Kindprozess umgeleitet werden sollte. (kann in diesem Beispiel etwas wie system("./calc/calc "); sein) Ich bin neu in diesem Bereich. Kannst du es mir sagen?

BTW, ich weiß nicht, ob ich vermisse die Umsetzung des gesamten Prozesses zu verstehen, weil es eine Frage ist und ich die offizielle Lösung nicht kenne.

+0

Was ist die _actual problem_ Sie auf diese Weise zu lösen versuchen? –

Antwort

0

Verwenden Sie "dup2" und ersetzen Sie die "stdout" mit "pipe" write file descriptor.

Ich nehme an, Ihre Pipe ist gut von Eltern zu Kind konfiguriert.

Dann Kind kann vom anderen Ende lesen.

dup2 (fd, 1); // 1 ist für stdout

Zweite Option: (falls Ihr Rohr ist nicht gut mehr)

Verwendung Shared Memory.

Gemeinsames Speicherobjekt erstellen.

Umleiten von STDOUT von Parent zu Shared Memory.

Kind kann es sehen.

hier ist ein Beispiel http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/example-1.html

+0

Nun, der Link ist nicht mein Code, nur ein ähnliches Beispiel. Ich denke 'System ("./Calc/calc ");' ist ein Platz, den ich gemäß meiner Frage ändern muss. Because benötige ich Elternprozeß, um das System 'printf zu implementieren, während das Kind, das zu stdout hört – shen

+0

Versuchen Sie Shared Memory-Objekt. Aktualisierte Antwort – Naidu

Verwandte Themen