端末に入力したものをファイルに書き込むプログラムを作成したいと思います。
これは実際には非常に簡単で、このためにパイプは必要ありません。 (アプリケーション自体は、パイプの役割を果たします。)
これは私がこれを証明するために何をしたかである:mycat.c
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc < 2) {
fprintf(stderr, "ERROR: No output file!\n");
fprintf(stderr, "Usage: mycat FILE\n");
return 1;
}
FILE *fOut = fopen(argv[1], "w");
if (!fOut) {
fprintf(stderr, "ERROR: Cannot open file '%s' for writing!", argv[1]);
}
int c;
while ((c = getc(stdin)) >= 0) {
if (putc(c, fOut) < 0) {
fprintf(stderr, "ERROR: Cannot write to file '%s'!", argv[1]);
}
}
if (fclose(fOut)) {
fprintf(stderr, "ERROR: Cannot write to file '%s'!", argv[1]);
}
return 0;
}
それはstdin
から文字を読み取り、されているファイルストリームfOut
に書き込みを以前はfopen()
で公開されました。これは、getc()
が失敗するまで繰り返されます。入力の終了のために。 Cygwinの/ Windowsの10のBashで
サンプルセッション:
$ gcc --version
gcc (GCC) 6.4.0
$ gcc -std=c11 -o mycat mycat.c
$ ./mycat
ERROR: No output file!
Usage: mycat FILE
$ ./mycat mycat.txt
Hello World.
tip tip tip
この時点では、私はbash
入力の終わりを知らせるためにはCtrl +Dを入力しました。
$ cat mycat.txt
Hello World.
tip tip tip
$
私は出力にmycat.txt
の内容をcat
を使用。以前に入力したものです(期待どおり)。
cat
私が質問を読むと、実際に私の最初のアイデアでしたが、私は考えました:それはc(bashではない)というタグの質問です。したがって私のCサンプルコード。
完全性については
、cat
と同じ:
$ cat >mycat.txt <<'EOF'
> Hello cat.
> key key key
> EOF
$ cat mycat.txt
Hello cat.
key key key
$
これは<<'EOF'
はbash
によって解釈何かであることを私を思い出しました。そこで、以下では、同様に動作します
$ ./mycat mycat.txt <<'EOF'
Hello World.
tip tip tip
EOF
$ cat mycat.txt
Hello World.
tip tip tip
$
順番にリダイレクトされる可能性があります、それは引数(S)として、入力ファイル(複数可)を取り、stdout
への書き込みもののcat
は(非常に似ていますことを、この私に聞かせて信念シェルで呼び出すとき)。鉱山に反対すると、cat
は引数が与えられていないと失敗しません。– stdin
から読み込みます。
パイプと標準入力/出力の仕組みを誤解しているようです。おそらくあなたは解決しようとしている*実際の問題について詳しく説明することができますか? *なぜ標準*入力*をファイルに書き込む*にリダイレクトしたいのですか? –
'dup2'からの戻りコードを確認しましたか? – bruceg
'O_RDONLY'(読み込み専用)モードで' t.txt'を間接的にオープンしました.-古典的には0ですので、 'O_WRONLY'と' O_RDWR'の両方を省略すると 'O_RDONLY'を指定するのと同じです。したがって、ファイルへの書き込みに問題があります。しかし、他の概念上の問題、特に「パイプに書いているもの」(短い答えが「何もない」)があります。何もパイプに書き込むことなく、パイプの書き込み終了がまだ開いていると、読み取りは無期限にハングします。 'dup2()'コールは、事をさらに混乱させるだけです。 –