Ich versuche, die Antwort eines Char-Ausdruck mit bc durch Rohre zu bekommen. Ich möchte zuerst den Ausdruck in der Pipe1 schreiben, die die BC liest und die Antwort in Pipe2 schreiben. Dazu verändere ich die Ein- und Ausgabe. Das funktioniert, wenn ich [] kein Zeichen verwenden und einfach den Ausdruck in der Schreib:Verwenden von BC durch Rohre und Gabel
write(pipe1[1], "20*5\n", sizeof("20*5\n")-1) != sizeof("20*5\n")-1)
Aber wenn ich eine Registerkarte erklären, halte ich den Fehler bekommen:
(standard_in) 2: illegal character: ^@
Manchmal es ist 1 statt 2
Was mache ich falsch? Wenn mir jemand erklären könnte, danke.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
char resultat[5];
int pipe1[2];
int pipe2[2];
pipe(pipe1);
pipe(pipe2);
int resultat_fork = fork();
if (resultat_fork == -1)
{
exit(EXIT_FAILURE);
}
char* expression = "20*5\n";
if (resultat_fork != 0)
{
//printf("I am the parent\n");
close(pipe1[0]);
close(pipe2[1]);
if (write(pipe1[1], expression, sizeof(expression)) != sizeof(expression))
fprintf(stderr, "write to child failed\n");
int nbytes = read(pipe2[0], resultat, sizeof(resultat));
if (nbytes <= 0)
fprintf(stderr, "read from child failed\n");
else
printf("resultat: %.*s\n", nbytes, resultat);
close(pipe1[1]);
close(pipe2[0]);
}
else
{
printf("I am the child\n");
close(pipe1[1]);
close(pipe2[0]);
dup2(pipe1[0], 0);
dup2(pipe2[1], 1);
close(pipe1[0]); /* More closes! */
close(pipe2[1]); /* More closes! */
execlp("bc", "bc", NULL);
fprintf(stderr, "Failed to execute bc\n");
exit(EXIT_FAILURE);
}
return 0;
}
Die Variable Ausdruck ist ein Zeiger, kein Array. Verwenden Sie 'strlen()' anstelle von 'sizeof'. (Ich habe erwähnt, dass ich 'strlen()' im Kommentar zu meiner vorherigen Antwort auf eine frühere Variante dieser Frage verwende.) –
Okay, bitte akzeptiere meine Entschuldigung, ich habe es im Moment nicht wirklich verstanden. – Karl
Entschuldigung akzeptiert - es kann schwierig sein, die Nuggets nützlicher Informationen im Detritus des Kommentars zu erkennen (sowohl innerhalb als auch nach einer Antwort). –