Câu trả lời:
Một ống không tên về bản chất là riêng tư đối với các ứng dụng có bộ mô tả tệp. Không có cách nguyên tắc nào để quan sát hoặc sửa đổi lưu lượng trên đường ống. Tôi cũng không nghĩ có cách nào để nhìn vào đường ống trực tiếp trên Linux.
Mặc dù, có một cách bất hợp lý là ít nhiều làm những gì bạn đang theo đuổi, thông qua: thông qua cuộc gọi hệ thống ptrace . Bạn sẽ không giải quyết vấn đề, nhưng vào một trong các quy trình. Để quan sát, sử dụng strace , vd
strace -p1234 -s99999 -e write
nơi 1234
là quá trình ID của một quá trình viết trên ống. Sửa đổi dữ liệu khó hơn, nhưng có thể được thực hiện. Tôi nghĩ cách dễ nhất là trước tiên hãy thiết lập một quy trình trung gian sao chép đầu vào tiêu chuẩn của nó sang đầu ra tiêu chuẩn của nó, cộng với dữ liệu bạn muốn tiêm (và trừ bất kỳ dữ liệu nào bạn muốn loại bỏ). Tạo hai ống được đặt tên và bắt đầu quá trình trung gian đó với stdin trên một ống và thiết bị xuất chuẩn trên ống kia. Sau đó, sử dụng trình gỡ lỗi (ví dụ GDB ) để làm cho cả hai quá trình đích thực thi open
trên đường ống có tên thích hợp, sau đó dup
đặt đường ống trên bộ mô tả tệp thích hợp. Lưu ý rằng có khả năng bạn sẽ gặp sự cố một trong các quy trình trong quy trình.
(Nếu bạn không hiểu đoạn cuối, tôi xin lỗi, nhưng nó đòi hỏi một mức độ kỹ thuật nhất định. Tôi không nghĩ có một cách dễ dàng hơn.)
Một số công cụ hữu ích để theo dõi đường ống:
Đối với chương trình đã chạy mà người ta không điều khiển đường ống, hãy xem phương thức gdb:
Chuyển hướng đầu ra từ một quy trình đang chạy .
Hoặc người ta có thể sử dụng strace :
strace -ewrite -p $PID 2>&1 | grep "write(1"
chỉ hiển thị mô tả 1 cuộc gọi. "2> & 1" là để chuyển hướng stderr sang stdout, vì strace ghi vào stderr theo mặc định.