Tại sao tôi có thể đổi tên một tệp thực thi đang chạy, nhưng không xóa nó?


12

Tất cả mọi thứ là trong tiêu đề, nhưng chính thức hơn:

Tại sao Windows cho phép tôi đổi tên một tệp thực thi đang chạy, nhưng không xóa nó?

Câu trả lời:


12

Thực sự không có gì gọi là đổi tên một tập tin. Một tệp có thể có nhiều hơn một tên hoặc không có tên, vì vậy đó không phải là tệp bạn đang đổi tên mà là mục nhập thư mục. Đổi tên là một hoạt động trên mục nhập thư mục, không bị ảnh hưởng bởi thực tế là tập tin bị khóa để thực thi.


2
Hmm, tại sao sau đó bất kỳ nỗ lực để đổi tên một tệp thông thường được mở để đọc hoặc viết đều thất bại?
Serge

5
@Serge: Bởi vì quá trình mở tệp đặc biệt yêu cầu nó thất bại bằng cách đặt các cờ mở thích hợp.
David Schwartz

cờ mở cụ thể là gì?
n611x007

2
Nhiều khả năng, thiết lập dwShareModevề 0 hoặc sử dụng OF_SHARE_COMPAThoặc OF_SHARE_EXCLUSIVEcờ.
David Schwartz

6

Nó không cho phép xóa tệp thực thi và DLL vì Windows ánh xạ các phần của tệp thực thi vào bộ nhớ như một phần của quá trình tạo, do đó, nó cần tệp trong suốt vòng đời của quy trình.

Thật không may, tôi không có lý do thực sự tại sao nó vẫn cho phép đổi tên các tập tin như vậy. Tôi đoán rằng điều này được thực hiện để cho phép cập nhật các tập tin dll và exe trong khi chúng đang chạy để giảm thiểu thời gian gián đoạn dịch vụ.

Ngược lại, linux (unix nói chung) cho phép xóa một tập tin thực thi trong khi nó đang chạy:

tmp]$ cp /usr/bin/md5sum .;ll md5*; \
(./md5sum /home/pub/iso/FC5/FC-5-i386-DVD.iso & ); \
rm md5sum ; ll md5*;ps -f
-rwxr-xr-x 1 sergey sergey 37276 Oct 16 02:38 md5sum
ls: cannot access md5*: No such file or directory
UID        PID  PPID  C STIME TTY          TIME CMD
sergey    2423  2422  0 02:32 pts/1    00:00:00 -bash
sergey    2533     1  0 02:38 pts/1    00:00:00 ./md5sum /home/pub/iso/FC5/FC-5-
sergey    2536  2423  0 02:38 pts/1    00:00:00 ps -f

Lưu ý rằng, ví dụ Linux cũng ánh xạ các phần của tệp thực thi vào bộ nhớ, nhưng không có vấn đề gì cho phép bạn xóa tệp thực thi đang chạy.
ChrisInEd hôm

2
@ChrisInEdmont Có, nhưng điều này tôi đã giải thích ở đây: unix.stackexchange.com/questions/49299/ trộm
Serge

Serge, lời giải thích tốt đẹp đó. :)
ChrisInEd hôm

Linux sẽ không cho phép bạn xóa một tập tin trong khi nó đang thực thi. Tuy nhiên, bạn có thể xóa các mục nhập thư mục, vì những mục này không được thực thi.
David Schwartz

@DavidSchwartz vui lòng xem bản cập nhật cho câu trả lời của tôi. Linux cho phép tôi hủy liên kết bất kỳ tệp nào đang được thực thi miễn là tôi có đủ quyền để xóa tệp đó.
Serge

2

Tôi đoán đó là vì tên chỉ là một thuộc tính có cùng nội dung nhị phân của tệp, do đó, miễn là dữ liệu ở đó, xử lý, được giữ bởi quá trình chạy cho nó sẽ không thay đổi.

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.