【Python程式1中】
import ctypes
import posix_ipc
import multiprocessing
from multiprocessing import shared_memory
# 如果系統中已經存在名為 /semaphore1 的訊號量物件,Python並不會重新初始化它,而是使用現有的訊號量,
# 導致現有的訊號量可能有殘留狀態,使得 acquire() 一直阻塞。
# 在建立訊號量之前,先刪除現有的同名訊號量
try:
posix_ipc.unlink_semaphore("/semaphore1")
except posix_ipc.ExistentialError:
pass # 如果訊號量不存在,忽略錯誤
# 建立具名訊號量(其他程序可以使用同樣的名稱 "/semaphore1" 來訪問),1表示有物品,0表示沒物品
# 注意,需要intial_value = 1,這樣訊號量一開始才會有一個
# 使用 O_EXCL 標誌來強制建立一個新的訊號量
sem = posix_ipc.Semaphore("/semaphore1", flags=posix_ipc.O_CREAT | posix_ipc.O_EXCL, initial_value=1)
# 建立一個大小為 ctypes.c_int 所需的共享記憶體塊
shm = shared_memory.SharedMemory(create=True, size=ctypes.sizeof(ctypes.c_int), name="steel")
# 使用 ctypes 將共享記憶體對映為一個整數
shared_int = ctypes.c_int.from_buffer(shm.buf)
sem.acquire() # 獲取訊號量
###########需要執行的操作 ####################
if (out1 == True):
# 檢測到有輸入
shared_int.value = 1
else:
shared_int.value = 0
############ 需要執行的操作 #####################
sem.release() # 釋放訊號量
# 釋放共享記憶體
shm.close()
shm.unlink()
# 刪除訊號量(通常由建立訊號量的程序負責清理)
sem.unlink()
【Python程式2中】
import posix_ipc
from multiprocessing import shared_memory, resource_tracker
import ctypes
# 連結訊號量
sem = posix_ipc.Semaphore("/semaphore1")
# 連線到名為 "steel" 的共享記憶體塊
shm = shared_memory.SharedMemory(name="steel")
# 使用 ctypes 將共享記憶體對映為一個整數
shared_int = ctypes.c_int.from_buffer(shm.buf)
# 取消資源跟蹤,在另一個程式1中會釋放這個共享記憶體
resource_tracker.unregister(shm._name, "shared_memory")
sem.acquire() # 獲取訊號量
########## 待執行操作#################################
if shared_int.value ==1:
message = "True"
else:
message = "False"
########### 待執行操作###############################
sem.release() # 釋放訊號量