簡體   English   中英

條件(類型 & ~(R_OK|W_OK|X_OK|F_OK))在 C 中如何工作?

[英]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)

https://code.woboq.org/userspace/glibc/io/access.c.html

該表達式使用按位算術

a | b | c … a | b | c …創建一個包含abc ... 的所有位的值。

在您的代碼中, R_OK等是位標志,每個標志都有一個不同的位集。 因此,它們的析取(= 或將它們組合在一起)設置了所有位,而沒有其他位。

~ x反轉一個值的位。 因此,操作的結果除了R_OK等之外的所有位都設置了。

最后, a & b僅設置ab中設置的那些位。 所有其他位將為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM