Tại sao openat () cần thiết để tránh điều kiện cuộc đua hai bước với stat và sau đó mở ()?


1

Giải thích tại

http://man7.org/linux/man-pages/man2/open.2.html

về lý do openatcần thiết, đọc một phần:

openat() allows an application to avoid race conditions that
   could occur when using open() to open files in directories other than
   the current working directory.  These race conditions result from the
   fact that some component of the directory prefix given to open()
   could be changed in parallel with the call to open().  Suppose, for
   example, that we wish to create the file path/to/xxx.dep if the file
   path/to/xxx exists.  The problem is that between the existence check
   and the file creation step, path or to (which might be symbolic
   links) could be modified to point to a different location.

Tôi không hiểu tại sao cuộc đua này là một vấn đề. Nếu một ứng dụng muốn kiểm tra sự tồn tại của một số tệp và nếu vậy, hãy tạo một tệp khác , tất nhiên đây là hai bước và ứng dụng nên và có thể đảm bảo rằng không có gì can thiệp vào giữa. Chỉ khi một cuộc gọi duy nhất open()có thể gây ra tình trạng cuộc đua, một số tòa nhà khác, chẳng hạn như openat()cần thiết. Mặt khác, đây không phải là cho các tòa nhà chọc trời để giải quyết, nhưng đó là trách nhiệm của một ứng dụng.

Tôi không hiểu gì ở đây?


Các vấn đề cụ thể đối với lập trình và phát triển phần mềm không có chủ đề, xem On-Topic . Hãy thử Stack Overflow nhưng trước tiên hãy đọc Làm thế nào để tôi hỏi một câu hỏi hay? . Bạn có thể gắn cờ câu hỏi của mình và yêu cầu người điều hành di chuyển nó.
DavidPostill

@DavidPostill Tôi biết về StackOverflow, tôi đặc biệt chọn đăng bài ở đây, vì StackOverflow dành cho những câu hỏi như thế này "Tôi đang cố gắng lập trình xyz, đây là những gì tôi đã thử, nó không hoạt động". Câu hỏi trên không phải như thế, nó không phải là một câu hỏi lập trình.
322908

Đây một vấn đề lập trình - bạn đang yêu cầu giải thích về cách thức và lý do tại sao một số lệnh gọi API hoạt động.
DavidPostill

@DavidPostill OK Tôi đã chuyển nó, tôi hy vọng họ không nói ở đó "câu hỏi này không phải là một câu hỏi lập trình".
322908

Câu trả lời:


0

Cuộc đua chỉ đề cập đến các tệp không có trong thư mục hiện tại. Đường dẫn tương đối mà bạn đang chuyển đến openat () có thể chứa một liên kết tượng trưng trỏ đến một thư mục khác với đường dẫn bạn đang mong đợi.

Nếu bạn chỉ sử dụng open () với các tệp trong thư mục hiện tại (sau khi chắc chắn rằng bạn đang ở nơi bạn muốn), bạn sẽ tránh được vấn đề này.


1
Tôi xin lỗi, nhưng bạn chỉ đang nghỉ ngơi những gì trang người đàn ông nói, không trả lời bất kỳ câu hỏi của tôi. Tôi biết các triệu chứng của cuộc đua, bạn không cần phải giải thích cho tôi. Tôi không hiểu tại sao ứng dụng không được mong đợi để đối phó với cuộc đua và tại sao cần có một tòa nhà cao tầng riêng biệt.
322908
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.