Có '\ 0' ở cuối mỗi tập lệnh không?


7

Tôi đang tự hỏi làm thế nào bạn làm hỏng phần cuối của tập lệnh / tập tin? Tôi đặc biệt quan tâm đến các phiên bản Unix cũ (như động cơ V6).

Có '\ 0' sau ký tự viết cuối cùng không?


2
Các tập lệnh Shell là các tệp văn bản và như vậy lý tưởng không bao gồm bất kỳ byte nào, mặc dù làm như vậy có thể sẽ không làm giảm việc sử dụng bình thường.
goldilocks

Câu trả lời:


12

Các chương trình người dùng trong các Unix thậm chí cũ hơn không thấy các byte "pad" ở cuối tệp. Tôi biết rằng MS-DOS hoặc CP / M sẽ lấp đầy các khối đĩa bằng các ký tự Ctrl-Z, do đó, không chỉ thuật toán đọc tệp phải kiểm tra các khối cuối đĩa, nó còn phải kiểm tra các byte đệm.

Unix không bao giờ làm điều đó. Các chương trình đọc byte cho đến khi điều kiện cuối tập tin xảy ra, đối với lệnh read(2)gọi hệ thống có nghĩa là trả về 0. Đáng tiếc, một cuộc gọi hệ thống chạy dài có thể bị gián đoạn, điều này gây ra read()trả về mã lỗi (-1) và ký hiệu toàn cục errnođánh giá với EINTR, do đó, Unix cũng thường giới thiệu một số sự ngu ngốc khi đọc một số thiết bị nhất định.

Ngoài ra còn có một khía cạnh hệ thống tệp cho tất cả: Các hệ thống tệp Unix sẽ đưa dữ liệu vào các khối đĩa và giữ một giá trị kích thước tệp trong byte trong nút. Một số HĐH khác chỉ giữ kích thước tệp trong các khối. Nếu dữ liệu nhỏ hơn một khối, vấn đề sẽ nổi lên trong vùng người dùng, với các byte pad hoặc vô nghĩa khác.


5
CP / M sẽ lấp đầy các bản ghi 128 byte bằng Ctrl + Z, nhưng DOS chưa bao giờ làm như vậy - nó luôn ghi lại độ dài tệp chính xác giống như Unix (mặc dù nhiều chương trình đã chấp nhận ^ Z làm điểm đánh dấu cuối tệp).
psmears

@psmears Tôi đã thấy các tệp DOS có ^ Z đệm byte, trở lại vào thời điểm bình minh. Tôi nghĩ đó có thể là sự cố của DOS 1.x hoặc có thể chỉ là sự cố với các chương trình được viết cho CP / M và sau đó được chuyển sang DOS 1.x. Các tệp IIRC, Wordstar có ^ byte đệm ... điều này sẽ xảy ra vào giữa những năm 1980. Lưu ý rằng ngay cả trong một thời gian sau khi DOS 2.0 xuất hiện và thay đổi mọi thứ, vẫn có một vài chương trình nổi xung quanh được viết cho DOS 1.x và chúng vẫn hoạt động (nói cách khác là DOS 2.x tương thích ngược).
steveha

3
@steveha: Tôi nghi ngờ "được viết cho CP / M và sau đó được chuyển" là lời giải thích (vì nó dành cho rất nhiều công cụ DOS kỳ lạ :))
psmears

Các tệp nhị phân (có thể chứa bất kỳ chuỗi byte nào) được xử lý trên các hệ thống sử dụng phần đệm?
orion

1
@orion câu hỏi hay - Tôi đề nghị bạn làm cho nó một câu hỏi riêng biệt mới.
peterph

4

Không cần thiết. Người phiên dịch shell đọc file với kịch bản sử dụng một số (nhiều hơn hoặc ít phức tạp) syscall wrapper (ví dụ read()của fread()) và điều đó sẽ báo hiệu tình trạng end-of-file khi nó đạt đến byte cuối cùng của tập tin (mà không cần phải bằng không).

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.