2015-06-15 35 views
20

Tôi muốn kích động một tình huống mà không có bộ mô tả tệp nào còn lại.Làm thế nào tôi có thể mô phỏng một thiếu mô tả tập tin?

Tôi đã suy nghĩ về 2 khả năng:

  1. Mở hàng ngàn tập tin ngẫu nhiên cho đến khi kết quả của mở là -1
  2. Đặt một số lượng rất thấp của bộ mô tả tập tin có sẵn (giả sử stdin, stdout và stderr).

Bạn sẽ làm như thế nào?

Trả lời

31

Bạn có thể giới hạn số lượng bộ mô tả tệp mà quy trình có thể mở trong Linux bằng ulimit.

Thực hiện ulimit -n 3 trước khi chạy chương trình C của bạn sẽ làm cho nó trở thành lỗi khi mở bất kỳ tệp nào khác, vì stdin, stdout và stderr chiếm 3 bộ mô tả đầu tiên.

Một ví dụ:

$ ulimit -n 3 
$ echo > /dev/null 
zsh: too many open files: /dev/null 

Quá trình shell bản thân cố gắng để mở/dev/null để chuyển hướng stdout trước khi đóng cửa nó ở đó, do đó nó được một lỗi. Chương trình C của bạn sẽ bị lỗi chính xác khi lần đầu tiên gọi số fopen, mở, socket, v.v ... (hoặc bất kỳ thứ gì phân bổ bộ mô tả tệp mới).

+8

Hoặc sử dụng ['setrlimit'] (http://linux.die.net/man/2/setrlimit) từ C. – o11c

+0

Vỏ có tạo mô tả tệp khi sinh ra một chương trình bên ngoài không? Tôi nghĩ rằng một đường ống ít nhất sẽ cần phải sử dụng 'ống (2)' và các loại thay thế cũng có thể gây ra vấn đề. Ít nhất, bạn nên biết rằng ulimit này sẽ làm hỏng vỏ của bạn. – Kevin

+0

@Kevin, chuyển hướng có thể được thực hiện thông qua 'dup (2)', 'dup2 (2)', hoặc 'pipe (2)', nhưng khi shell đơn giản sinh ra một chương trình và chỉ forks và sử dụng 'execve (2)' chuyển qua 3 bộ mô tả đầu tiên mà không cần tạo mô tả mới cho quy trình con. Để chuyển hướng thực tế, bất kể bạn sử dụng cái gì, một bộ mô tả được tạo ra, vì bộ mô tả được nhân đôi trước khi nó có thể được gán lại/đính kèm, như stdin đã được gắn với bộ mô tả stdin của trình bao. Giới hạn chỉ có thể được nâng lên một lần nữa sau khi kiểm tra của bạn lên đến giới hạn trên mặc định (xem mặc định bằng 'ulimit -n'). – Matthew

Các vấn đề liên quan