45 若要檢查旗誌是否已存在於系統中,應使用什麼方式?
(A) 使用access()函數
(B) 使用sem_open()函數
(C) 使用sem_init()函數
(D) 使用sem_post()函數
統計: A(0), B(4), C(2), D(2), E(0) #3399892
詳解 (共 2 筆)
【第一步:找關鍵字】
旗誌(Semaphore,號誌)
→ 作業系統用來做「同步控制(避免多個程式搶資源)」的工具
檢查是否已存在
→ 關鍵在「不是建立」,而是「確認有沒有」
關鍵字判讀:
?「存在檢查」+「Semaphore」
【第二步:白話翻譯】
這題在問:
?「我想知道系統裡某個 semaphore(號誌)有沒有已經被建立,要用哪個函數?」
【第三步:解題思路】
這題在考什麼觀念?
? POSIX Semaphore(作業系統的號誌 API)使用方式
解題步驟
-
分清楚各函數用途:
-
sem_open()
→ 開啟「已存在的 semaphore」或建立新的 -
sem_init()
→ 初始化(通常是記憶體內的 semaphore) -
sem_post()
→ signal(釋放資源) -
access()
→ 檢查「檔案」是否存在
-
題目重點:
?「檢查是否存在」
→ 在 POSIX 中,sem_open() 可以用來嘗試開啟既有 semaphore
→ 如果不存在就會失敗
-
結論:
? 用 sem_open() 來判斷
原理與規則
sem_open(開啟號誌)是什麼?
→ 用名稱去「找系統中的 semaphore」
-
如果存在 → 成功打開
-
如果不存在 → 失敗(除非指定建立)
生活比喻:
你去租置物櫃:
-
sem_open → 嘗試打開某個櫃子
-
有 → 打得開
-
沒有 → 打不開
-
? 這就等於「檢查存在」
【第四步:選項分析】
-
(A) 使用 access() 函數
❌ 錯
→ access 是檢查「檔案」存在
→ 不是 semaphore
-
(B) 使用 sem_open() 函數
✅ 正確
→ 用來「開啟已存在的 semaphore」
→ 若不存在會回傳錯誤 → 可用來判斷
-
(C) 使用 sem_init() 函數
❌ 錯
→ 用於初始化(通常是記憶體內 semaphore)
→ 不是用來查存在
-
(D) 使用 sem_post() 函數
❌ 錯
→ 用來釋放 semaphore(+1)
→ 完全不是檢查用途
【觀念補充與延伸】
核心觀念定位
這題屬於:
? 作業系統 → 同步機制(Semaphore API)
? 常考 API 功能辨識題
法條或定義
POSIX Semaphore(POSIX 號誌)
→ 一套標準 API,用來做程序同步
常見函數:
-
sem_open → 開啟/建立
-
sem_wait → 等待(P)
-
sem_post → 釋放(V)
-
sem_close → 關閉
觸類旁通(舉一反三)
對比概念:
-
sem_open → 「找或開」
-
sem_init → 「初始化(記憶體內)」
? 常考差異!
變化題型:
-
哪個函數是 P 操作?(sem_wait)
-
哪個是 V 操作?(sem_post)
-
sem_open vs sem_init 差別
【記憶口訣】
?「要找 semaphore,就用 open」
或:
?「存在用 open,操作用 post/wait」
【常見陷阱】
學生最容易搞混的地方
-
把 access() 當萬用「存在檢查」
-
忘記 semaphore 是 OS 物件,不是檔案
心理盲點
看到「檢查存在」就選 access
? 但題目是 semaphore,不是檔案!
避坑指南
解題順序:
-
先判斷「物件是什麼」
-
再選對應 API
? 檔案 → access
? semaphore → sem_open