パイプを使ってbcを使ってchar式の答えを得ようとしています。 最初に式をpipe1に書くと、bcはパイプ2で答えを読み書きします。このために、私は入力と出力を変更しています。パイプとフォークを使ってbcを使う
write(pipe1[1], "20*5\n", sizeof("20*5\n")-1) != sizeof("20*5\n")-1)
しかし、私はタブを宣言した場合、私はエラーを取得しておく:たまに
(standard_in) 2: illegal character: ^@
私は[]のcharを使用し、ちょうど書き込みに式を入れていない場合、これは作業を行います2の代わりに1になります
私は間違っていますか?誰かが私に説明できるなら、ありがとう。
コード:
#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;
}
変数 'expression'はポインタであり、配列ではありません。 'sizeof'の代わりに' strlen() 'を使います。 (私はこの質問の以前の変形に対する私の以前の答えに対する解説で 'strlen()'を使って言及しました) –
申し訳ありません、私の謝罪を受け入れてください。 – Karl
謝罪が受け入れられました - 解説のデリタスの中で有用な情報のナゲットを検出するのは難しいでしょう(答えの中と後の両方)。 –