2011-06-30 30 views
7

Tôi đang cố gắng hiểu các cờ cho trường st_mode của cấu trúc stat của lệnh stat đó, nhưng tôi đang gặp khó khăn như vậy! Tôi tìm thấy ví dụ này here, nhưng tôi thực sự không hiểu đoạn mã này:cờ cho st_mode gọi hệ thống stat

if (mode & S_IRUSR) str[1] = 'r'; /* 3 bits for user */ 
if (mode & S_IWUSR) str[2] = 'w'; 
if (mode & S_IXUSR) str[3] = 'x'; 

if (mode & S_IRGRP) str[4] = 'r'; /* 3 bits for group */ 
if (mode & S_IWGRP) str[5] = 'w'; 
if (mode & S_IXGRP) str[6] = 'x'; 

if (mode & S_IROTH) str[7] = 'r'; /* 3 bits for other */ 
if (mode & S_IWOTH) str[8] = 'w'; 
if (mode & S_IXOTH) str[9] = 'x'; 

Tôi biết rằng "&" là phép toán AND điều hành, nhưng không có gì khác. Tôi thậm chí không biết phải hỏi gì.

PD: Xin lỗi về các câu hỏi trước tôi đã hỏi. Tôi không biết cách đánh dấu câu hỏi được trả lời hoặc bất cứ điều gì tương tự: (

Trả lời

2
Chế độ

là một cách phổ biến để đóng gói dữ liệu. Hãy nghĩ từng bit trong trường là công tắc bật tắt có thể được đặt để tắt hoặc bật. Để kiểm tra xem nút bật có được bật hay không, bạn hãy kiểm tra xem liệu bit thích hợp đã được đặt bằng toán tử & hay chưa. Bạn có thể đặt bit bằng cách sử dụng | và xóa chúng bằng cách sử dụng ~ bitwise operations.

1

Vâng, POSIX spec for <sys/stat.h> liệt kê mọi thứ bạn có thể học từ trường st_mode của struct stat.

Câu hỏi của bạn là "Trường này có thể cho tôi biết điều gì" hoặc là nó "Làm thế nào để trích xuất thông tin", hoặc cả hai?

2

Điều này phổ biến trong việc lập trình hệ điều hành để sử dụng các số nguyên không dấu để giữ một chuỗi các bit mô tả điều gì đó. Trong trường hợp này, chế độ có 9 bit quan tâm. Một bit cho biết chủ sở hữu có thể đọc, một cho chủ sở hữu viết, một cho chủ sở hữu thực thi và các bit tương tự cho nhóm và những người khác. Bí quyết là trong việc giải nén cho dù một bit được thiết lập hay không.

Đây là một ví dụ. S_IRUSR là tên cho một bitmask mô tả bit "owner read". Nó được định nghĩa trong the specs là 0400 (bát phân) dịch thành 100000000 trong nhị phân. Khi bạn lấy nhị phân và giá trị này bằng mặt nạ, bạn nhận được giá trị 100000000 (nhị phân) nếu bit thứ 9 của mặt nạ được đặt. Nếu không, bạn nhận được 0.

Câu lệnh if sẽ đánh giá là true nếu giá trị lớn được trả về và sai khác. Bằng cách này nếu bit được thiết lập, 'r' được viết vào chuỗi vào vị trí 1. Kỹ thuật tương tự cũng áp dụng cho tất cả các bit khác.

+0

Cảm ơn, tôi không biết đó là bát phân, vì vậy chương trình của tôi không hoạt động! :-) – Gandaro

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