[英]Difference between access() with F_OK|R_OK and checking NULL pointer?
[英]How does the condition (type & ~(R_OK|W_OK|X_OK|F_OK)) work in C?
這里使用了什么樣的條件,它在 C 中是如何工作的?
(type & ~(R_OK|W_OK|X_OK|F_OK))
在這里找到它。
/* Test for access to FILE. */
int
__access (const char *file, int type)
{
if (file == NULL || (type & ~(R_OK|W_OK|X_OK|F_OK)) != 0)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (access)
該表達式使用按位算術。
a | b | c …
a | b | c …
創建一個包含a
、 b
、 c
... 的所有位的值。
在您的代碼中, R_OK
等是位標志,每個標志都有一個不同的位集。 因此,它們的析取(= 或將它們組合在一起)設置了所有位,而沒有其他位。
~ x
反轉一個值的位。 因此,操作的結果除了R_OK
等之外的所有位都設置了。
最后, a & b
僅設置在a
和b
中設置的那些位。 所有其他位將為 0。
因此,該表達式一起測試變量type
是否設置了任何未由R_OK
等定義的位。換句話說:它測試test
的值是否是R_OK
等之一,或這些值的組合。 如果不是這種情況(即,如果它具有其他值),則測試失敗。
您發布的 function 因此測試它是否收到有效的 arguments (即該file
不是NULL
,並且該test
是受支持標志的有效組合)。 除此之外,function 除了設置錯誤狀態並返回 -1 之外什么都不做。 這種奇怪行為的原因可以在最后一行看到:您發布的 function 是一個存根,它實際上並沒有實現正確的 POSIX access
function。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.