【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() # 释放信号量标签:Python,信号量,int,ctypes,posix,shared,共享,shm From: https://www.cnblogs.com/Daemon17/p/18514340