Ich versuche, mir selbst etwas Umleitung beizubringen. Und ich habe folgendes Problem:Mit Pipes und exec(), um eine andere Konsolenanwendung zu steuern
Ich habe ein einfaches Programm, das den Benutzer für eine ganze Zahl fragt und gibt dann einige andere Zahlen, tut es, dass auf unbestimmte Zeit, bis der Benutzer 0 eintritt, dann schließt es.
Ich versuche, einen Wrapper für das Programm, in der Zukunft schreiben könnte es einig GUI-Wrapper für eine andere Konsole-Anwendung sein. Ziel ist es, mit diesem Programm zu kommunizieren.
Mein erster Gedanke war, Rohre zu verwenden, um den Prozess Gabel, setzen Sie die Rohre auf die stdin und stdout des Kindes Prozess und dann exec() der Konsolenanwendung.
Nun, mein Code so funktioniert noch nicht richtig, da die Konsole-Anwendung nicht ausgeführt werden soll, aber es läuft wie üblich, in der Konsole, wird der Ausgang nicht gehen, wo ich es gehen will.
main()
{
int master_to_slave[2];
int slave_to_master[2];
pipe(master_to_slave);
pipe(slave_to_master);
int pid;
if((pid=fork())==0){
close(master_to_slave[1]);
close(slave_to_master[0]);
dup2(0, master_to_slave[0]);
dup2(1, slave_to_master[1]);
char *args[] = { NULL };
execv("/home/ebach/Documents/HIWI/random.exe",args);
}
else if(pid<0){
//ALARM ALARM
}
else{
close(master_to_slave[0]);
close(slave_to_master[1]);
while(1){
char buff[16];
int rd = read(slave_to_master[0], &buff, sizeof(buff));
if(rd > 0){
buff[rd-1] = '\0';
printf("Redirected: ");
for(int i = 0; i < rd; i++){
printf("T%c", buff[i]);
}
printf("\n");
}
}
wait(NULL);
}
}
Bis jetzt soll es nur die Ausgabe der Konsolen-App umleiten. (Wie Sie sehen können es sollte noch hinzufügen, nur ‚Weitergeleitet:‘
Anyways, ich bin nicht ganz beherrschen c wie Sie sehen können, so kann ich den Fehler nicht finden
Habe ich ‚Connect‘ das. falsche Rohre?
Eine andere Lösung, die ich stieß war die Verwendung von Pseudo-Terminals von forkpty mit() und exec(), sollte ich gehen diesen Weg?
Vielen Dank für jede Hilfe im Voraus!
Zusätzlich nach richtig düpiert die ursprünglichen FDs, die auf den Standard-Streams hinters Licht geführt wurden sollte geschlossen sein. –
Danke, das löst mein Problem. –