原文(日本語)
FileReadToolがFIFO、/dev/stdin、大容量ファイルでプロセスをブロックしていた問題を修正しました。
原文(英語)
Fixed FileReadTool blocking the process on FIFOs, /dev/stdin, and large files
概要
Claude Code v2.1.41では、FileReadTool(ファイル読み込みツール)がFIFO(名前付きパイプ)、/dev/stdin(標準入力)、または大容量ファイルを読み込む際にプロセス全体がブロック(応答停止)してしまう問題が修正されました。これにより、様々なタイプのファイルソースを安全に処理できるようになりました。
問題の背景
影響を受けていた状況
1. FIFO(名前付きパイプ)
FIFOは、プロセス間通信に使用される特殊なファイルです。読み取りは、書き込み側がデータを送信するまでブロックされます。
bash
# FIFOの作成
mkfifo /tmp/myfifo
# Claude CodeでFIFOを読み込もうとすると、無限待機状態に
claude
> "このファイルの内容を読んでください: /tmp/myfifo"
# ← ブロックされ、応答しなくなる2. /dev/stdin
標準入力デバイスを読み込もうとすると、入力待ちでブロックされます。
bash
# /dev/stdinを読み込もうとすると、入力待ちで停止
claude
> "このファイルを読んでください: /dev/stdin"
# ← キーボード入力待ちで停止3. 大容量ファイル
非常に大きなファイル(数GB以上)を読み込もうとすると、メモリ不足やタイムアウトが発生していました。
bash
# 5GBのログファイルを読み込もうとすると、プロセスが停止
claude
> "この大容量ログファイルを解析してください: /var/log/huge.log"
# ← メモリ不足またはタイムアウト基本的な使い方
通常のファイル読み込み
修正後も、通常のファイル読み込みは従来通り動作します。
bash
claude
> "このファイルを読んでください: README.md"
# 正常に読み込まれ、内容が表示されるFIFOの安全な処理
修正後は、FIFOが検出され、適切なエラーメッセージが表示されます。
bash
# FIFOの作成
mkfifo /tmp/datastream
# Claude CodeでFIFOを読み込もうとする
> "このファイルの内容を読んでください: /tmp/datastream"
# 修正後: 適切なエラーメッセージが表示される
❌ Cannot read file: /tmp/datastream is a FIFO (named pipe)
💡 FIFOs require active writers. Use regular files instead.実践例
プロセス間通信のデバッグ
FIFOを使用するシステムのデバッグ時、誤ってFIFOを読み込もうとしても安全です。
bash
# アプリケーションがFIFOを使用
mkfifo /tmp/app-communication
# FIFOの存在を確認しようとする
> "このディレクトリのファイルを確認してください: /tmp/"
# FIFOが検出され、適切に処理される
Found files:
- app-communication (FIFO - skipped)
- data.json (read successfully)標準入力リダイレクトの回避
誤って標準入力デバイスを読み込もうとした場合、適切に検出されます。
bash
# /dev/stdinを誤って読み込もうとする
> "このファイルを読んでください: /dev/stdin"
# 修正後: エラーメッセージが表示される
❌ Cannot read file: /dev/stdin is a character device
💡 Use regular files or provide file path instead of device files.大容量ログファイルの処理
大きなログファイルを分割して処理するよう提案されます。
bash
# 10GBのログファイル
> "このログファイルを解析してください: /var/log/application.log"
# 修正後: ファイルサイズが大きすぎる場合の警告
⚠️ File size: 10.5 GB (too large to read entirely)
💡 Suggestions:
1. Use 'tail -n 1000 /var/log/application.log' to read recent entries
2. Use 'grep ERROR /var/log/application.log' to filter specific content
3. Split the file into smaller chunks
# Claude Codeが適切なコマンドを提案・実行
> bash -c "tail -n 1000 /var/log/application.log"パイプライン処理の安全性
複雑なパイプライン処理を行う際、FIFO検出により安全性が向上します。
bash
# データ処理パイプライン
mkfifo /tmp/processing-pipeline
# バックグラウンドプロセスがFIFOに書き込み
cat large-data.csv | process-data > /tmp/processing-pipeline &
# Claude CodeでFIFOを読まないよう保護
> "このディレクトリのファイルを調べてください: /tmp/"
# FIFOは自動的にスキップされる
Found files:
- processing-pipeline (FIFO - skipped for safety)
- output.csv (read successfully)ファイルタイプの自動判定
様々なファイルタイプが混在するディレクトリでも安全に処理できます。
bash
# 様々なファイルタイプが存在
/project/
- data.txt (通常ファイル)
- stream.fifo (FIFO)
- /dev/random (デバイス)
- large.log (5GB)
> "このディレクトリのすべてのファイルを読んでください: /project/"
# 修正後: 各ファイルタイプを適切に処理
✓ data.txt - Read successfully
⚠️ stream.fifo - Skipped (FIFO)
⚠️ /dev/random - Skipped (device file)
⚠️ large.log - Too large (5GB), reading first 2000 lines onlyこの修正の利点
安定性の向上
- FIFOでのブロッキング回避
/dev/stdinなどのデバイスファイルの安全な処理- 大容量ファイルによるメモリ不足の防止
エラーハンドリングの改善
- 明確なエラーメッセージ
- 代替手段の提案
- ファイルタイプの適切な検出
ユーザー体験の向上
- プロセスがハングしない
- 予期しない待機状態の回避
- 大容量ファイルの適切な処理
ファイルタイプの判定
修正後、以下のファイルタイプが適切に検出・処理されます:
| ファイルタイプ | 動作 |
|---|---|
| 通常ファイル | 通常通り読み込み |
| FIFO(名前付きパイプ) | エラーメッセージを表示、スキップ |
| デバイスファイル(/dev/*) | エラーメッセージを表示、スキップ |
| 大容量ファイル(>100MB) | 警告表示、部分読み込み提案 |
注意点
- この修正は自動的に適用されます
- FIFOを読み込む必要がある場合は、Bashツールで
catコマンドを使用してください - 大容量ファイルは、最初の2000行のみが読み込まれる場合があります
- デバイスファイルを直接読み込むことはできません
大容量ファイルの推奨処理方法
部分読み込み
bash
# 最初の100行を読む
> bash -c "head -n 100 large.log"
# 最後の100行を読む
> bash -c "tail -n 100 large.log"フィルタリング
bash
# 特定のパターンのみ抽出
> bash -c "grep ERROR large.log"
# 日付範囲でフィルタ
> bash -c "grep '2026-02-15' large.log"ファイル分割
bash
# ファイルを100MBごとに分割
> bash -c "split -b 100M large.log chunk_"