Có đường ống phải viết tập tin tạm thời?


11

Tôi thấy rằng nếu tôi chuyển một lượng lớn dữ liệu giữa hai quy trình thông qua đường ống, một số tệp tạm thời sẽ được tạo bởi linux trong thư mục / tmp. Nếu thao tác đường ống thành công, tệp tạm thời tương ứng sẽ được hệ điều hành tự động xóa. Nhưng nếu hoạt động thất bại, tập tin tmp vẫn ở đó.

Vì một số lý do, tôi không muốn người dùng có cơ hội nhận được dữ liệu tôi đã chuyển đường ống trhough, vì vậy tôi không muốn bất cứ thứ gì còn lại trên đĩa cứng ngay cả khi chương trình của tôi bị hỏng. Tôi có thể làm cái này như thế nào?


4
Tôi rất nghi ngờ rằng đó là hệ điều hành tạo ra các tệp này, đặc biệt, tôi nghi ngờ đó là hoạt động đường ống.

@Neil: Điểm rất tốt. @OP: Bạn có chắc chắn người nhận không lưu trữ dữ liệu mà nó nhận được trên stdin vào tệp tmp? Nếu đó không phải là mã của riêng bạn và không phải là nguồn mở, bạn có thể kiểm tra bằng cách chuyển hướng đầu ra của bạn từ người gửi đến một tệp, sau đó gửi mã đó vào quy trình nhận dưới dạng luồng đầu vào, ví dụ: sender > filenamesau đó receiver < filename. Tôi sẽ kiểm tra tệp tmp trong cả hai op, để xem liệu người gửi hoặc người nhận đang thực hiện nó.

2
Không phải là một câu trả lời, nhưng tôi đã tìm thấy rất nhiều thông tin hữu ích về việc xử lý đường ống ở đây: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Không biết người này có thẩm quyền như thế nào, nhưng anh ta đặc biệt đề cập rằng một mkfifođường ống được xử lý không bao giờ thực hiện bất kỳ bộ đệm nào (tất cả!) Và không bao giờ tạo tệp.
Carl Smotricz

1
@Carl Smotricz: Liên kết bị hỏng, vì vậy tại đây: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

Ngoài ra, viết vào một đường ống sẽ chặn nếu đường ống quá đầy (cho đến khi ai đó đọc từ đầu kia).

Câu trả lời:


11
  1. ống không lưu trữ dữ liệu trên đĩa. / bin / echo foo | thanh grep không tạo bất kỳ tập tin. thử strace -f sh -c '/bin/echo foo | grep bar' xem tất cả các cuộc gọi hệ thống được thực hiện bởi trình bao khi chạy đường ống. echolà một shell dựng sẵn, vì vậy tôi đề nghị /bin/echolàm cho shell chạy một thực thi.

  2. /tmpkhông phải trên đĩa. Nó có thể được gắn trên tmpfs (tức là được hỗ trợ bởi bộ nhớ ảo). Lưu ý rằng khởi động lại sẽ trống /tmptrong trường hợp đó, vì vậy hãy sử dụng /var/tmpcho bất cứ điều gì bạn muốn để lại xung quanh.

Nếu những gì bạn đang làm là đưa dữ liệu vào một tệp, thì đó không phải là sử dụng đường ống. Nếu tệp là fifo, không phải là tệp thông thường, thì đó chỉ là một điểm hẹn có tên và không chứa dữ liệu. Sử dụng ls -l để tìm hiểu.

Và lưu ý rằng nếu bạn hy vọng ngăn người dùng nhìn thấy những gì đang diễn ra trong các quy trình mà họ sở hữu, thì bạn có khá nhiều SOL, bởi vì stracecó thể kiểm tra mọi thứ mà một quy trình tương tác với mọi thứ bên ngoài quy trình, ngoại trừ việc đọc / ghi được chia sẻ ký ức. ltracethậm chí còn xâm lấn hơn. Nếu chương trình của bạn sẽ chạy trên các hệ thống mà người dùng cục bộ đã root, bạn hoàn toàn không thể dừng chúng. Trên Unix, root có thể làm bất cứ điều gì và có các công cụ mạnh mẽ cho mục đích này.


1

Một ống thực sự là một khối bộ nhớ trong kernel, một bộ đệm được đọc / ghi bởi một số tiến trình. Nó không tạo tập tin ở bất cứ đâu.

Một số ứng dụng có các tùy chọn chuyển đổi giữa việc sử dụng đường ống (nhanh hơn, không nhấn đĩa, chiếm ít bộ nhớ hơn) và sử dụng tệp tạm thời (chiếm ít bộ nhớ hơn, cho phép bạn có thể xem các tệp tạm thời, chạm chậm hơn). gcclà một ứng dụng như vậy, mặc dù có lẽ là những ứng dụng khác.


0

Hack bẩn: Mã hóa dữ liệu trước khi gửi và giải mã nó khi nhận nếu bạn có thể thay đổi cả hai quy trình ...


Trên thực tế, sẽ không gọi đó là hack bẩn: Nếu dữ liệu nhạy cảm, có vẻ là một giải pháp thích hợp. Nhưng tôi tò mò về tập tin tmp. Là OP đúng mà kernel đang tạo ra nó? Hoặc là Neil đúng và đó là một đầu của ống hoặc đầu kia ...

Kernel không tạo tập tin tạm thời. Mặt khác, rất có thể quy trình nhận đang tạo một tệp tạm thời. Điều này khá phổ biến, vì nếu bạn muốn tìm kiếm trong đầu vào của mình, trước tiên bạn cần ghi nó vào một tệp.
larsks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.