編集:私が実行しようとしたプログラムにすべての入力をスキャンした後、無限ループが発生したことに気づきました。その後、EOFを読み取らないように無限に印刷してください。最後の入力を読み、無限ループに入ります。
たとえば、プログラムが次のようになっているとします。
printf("%c\n", getch());
while(1)
{
printf("%c\n", getch());
}
入力内容をすべて読んだ後にプログラムを終了する方法はありますか?入力ファイルのリダイレクトが完了したら、プログラムを終了できるようにしたいです。 (プログラムが入力ファイルから最後の文字を取得したとき)注:実行中のプログラムを変更することはできませんが、プログラムを実行しているスクリプトは変更できます。
これでプログラムを実行するためのスクリプトが作成されました。デフォルトでは、これは入力と出力を結合/マージするのに役立ちます。
編集:誰かが以前の問題を解決するのを手伝ってくれました。このトレースを破るために||を追加する必要がありましたが、上部の編集で新しい問題が発生しました。
mkfifo strace.fifo
{
while read -d, trace; do
if [[ $trace = *"read(0" ]]; then
IFS= read -rn1 answer <&3 || break
echo "$answer" >> in
answer=${answer:-$'\n'}
printf %s "$answer" >&2
printf %s "$answer"
fi
done < strace.fifo 3< input | strace -o strace.fifo -e read stdbuf -o0 ./a.out &
} >> $fname.out 2>&1
今私はスリープモードを使用し、プログラムを終了してプログラムを終了しようとする非常に奇妙な方法を持っています。そしてこれまで使用されている入力を確認して入力ファイルと比較しています。これは私がやっている作業のほんの一例です。現在、スクリプトには複数のタイマーがあり、以下のコードと比較的似ています。ただし、このアプローチは、入力が終了した後に入力ファイルの読み取りが完了しないとプログラムを終了しないため、良いアプローチではありません。私の実際のスクリプトはこのような複数のifステートメントを使用し、80%の時間動作しますが、時々タイマーとプログラムの実行方法の変動のために正しいタスクを実行しません。
sleep .05
awk 'BEGIN{ORS="";} NR==1{print; next;} /^[^ ]/ { print; next; } {print "\n";}' in > temp
diff -w -B temp input > /dev/null
# Check if input done yet
if [ $? -eq 0 ] ; then
# Check if program still running and input done
if [ "$(pidof a.out)" ] ; then
killall -15 a.out > /dev/null 2>&1
fi
fi
入力が完了したら、入力を処理する方法があるかどうか疑問に思いますkill
。strace
また、入力と出力を一緒にマージできるようにしたいです。
ベストアンサー1
もっと簡単な解決策があると思いますが、それがどのくらい移植性があるかはよくわかりません。考慮する:
$ cat trunc.c
#include <stdio.h>
int main() {
int c;
while(((c = getchar()) != EOF) && ((c & 0xff) != 0xff))
putchar(c);
return 0;
}
これは2の保守機械であるという事実を利用します(-1 & 0xff) == 0xff
。これは、EOFを文字で印刷するプログラムをキャプチャします。私はテストしました:
your_buggy_source_gen < any_ascii_file | trunc
cat any_ascii_file
これは、値が0xffのオクテットがないと仮定するのと同じです。