2010-01-26 31 views
6

Tôi đang học API POSIX và tôi không hiểu logic đằng sau một số tên.ngữ nghĩa S_IRUSR trong POSIX

ví dụ: S_IRUSR, S_IRUSR

Điều gì hiện S có nghĩa là gì? Tôi nhận được rằng RW là để đọc và viết. Nhưng quy ước đặt tên theo sau là POSIX là gì? Giống như Win32 theo sau Ký hiệu Hungary để đặt tên, POSIX làm theo gì để đặt tên cho chúng? Đối với các tiêu chuẩn như POSIX, phải có tài liệu cho nó ...

Trả lời

3

Hàng đầu S_ chỉ là để xác định cấu trúc/hàm mà hằng số đi cùng.

Từ <sys/stat.h>, các hằng số S_IRUSR, S_IWUSR, vv là những giá trị có thể cho các thành viên st_mode cho struct stat (sử dụng trong stat() và bạn bè). Tất cả các thành viên của struct stat bắt đầu bằng tiền tố st_ và có một số macro stat có liên quan cũng bắt đầu bằng S_. Quy ước chỉ đơn thuần là ở đó để làm cho các tên cấu trúc phù hợp, tên thành viên và hằng số dễ dàng hơn.

+2

Thực ra, hội nghị có một mục đích rất quan trọng khác. Nó ngăn chặn những thứ như '#define mode foo' khỏi phá vỡ' struct stat', vv 'st_ *' nằm trong vùng tên được đặt trước bởi header. Sẽ rắc rối hơn nhiều nếu tiêu chuẩn phải đặt riêng từng tên như 'chế độ' ... –

8

Tôi không chắc chắn liệu chúng có bất kỳ ý nghĩa nào ngoại trừ chúng ở số sys/stat.h, vì vậy S có thể là "stat".

Tôi đã thử thực hiện một số công việc thám tử, ví dụ: IEEE Std 1003.1, 2004 Edition entry for sys/stat.h nói điều này: Lần đầu tiên được phát hành trong Vấn đề 1. Xuất phát từ Số phát hành 1 của SVID.

Sau đó, Developer Specs for System V Application Binary Interface (xem Volume 1a [pdf]), trang 95 và thậm chí có tên bắt đầu bằng S_. Tôi đã không thể đi xa hơn thế này.

Về câu hỏi của bạn nói chung: phần lớn là lịch sử. Ví dụ: creat() nằm trong POSIX, nhưng là name comes from history. Nhiều tên hàm POSIX (và hành vi) xuất phát từ chuẩn C. Trên thực tế, mô tả của họ thường có text like:

Chức năng được mô tả trên trang tham chiếu này phù hợp với tiêu chuẩn ISO C. Bất kỳ xung đột nào giữa các yêu cầu được mô tả ở đây và tiêu chuẩn ISO C là không chủ ý. Ổ đĩa IEEE Std 1003.1-2001 này hoạt động theo tiêu chuẩn ISO C.

Tôi nghĩ cách duy nhất để tìm bất kỳ logic nào đằng sau API POSIX là đọc lịch sử của Unix.

Sau đây có thể giúp:

1

Alok là đúng. Xem the specification for sys/stat.h. Nếu bạn đã viết việc triển khai stat()/statvfs() của riêng bạn (rất phổ biến ở các cổng làm cho các chương trình phi posix hoạt động trên các máy chủ POSIX), bạn sẽ thêm tiền tố cho nó bằng một thứ khác, tức là Z_IRUSR.

Trong khi tôi không có danh sách tiện dụng, tôi khá chắc chắn rằng một số triển khai C cung cấp một số lựa chọn cho sys/stat, S_ cho bạn hành vi POSIX điển hình và (X) cho bạn cái gì khác. Tôi đã không thấy rằng trong một thời gian dài, mặc dù, đó là lý do tại sao tôi không thể nhớ lại nơi tôi chạy vào nó.

+0

Bạn đã giới thiệu liên kết đó như đang định sao lưu câu trả lời của Alok, nhưng đó là liên kết tương tự mà Alok đã đưa ra, và tôi không thấy bất cứ điều gì trong đặc tả nói * tại sao * tất cả tên bắt đầu bằng S. Ngoài ra, tại sao bạn có sử dụng các tên khác nhau trên máy chủ không thuộc Posix không? Sẽ không chỉ làm cho mã * ít * xách tay? –

+0

@Rob Kennedy: Như tôi đã lưu ý, (bây giờ hãy nhớ, chúng ta sẽ quay trở lại khi đặc tả UNIX duy nhất được đưa ra) một số hệ thống đã triển khai POSIX trên các triển khai độc quyền của chúng, vì vậy bạn phải cố tình sử dụng POSIX để lấy POSIX . Do đó, không gian tên là một yếu tố để giải quyết. Bạn sẽ không sử dụng các tên khác nhau trên máy chủ không thuộc nhóm posix, bạn sẽ sử dụng các tên khác nhau trên máy chủ posix. Tôi vô tình đảo ngược điều đó, cảm ơn! –