2011-04-23 14 views
5

Estoy trabajando en una aplicación paralela simple en la que deseo utilizar un único proceso para mantener la información de estado sobre una familia de procesos de trabajo. Parece relativamente fácil configurar una cola de mensajes POSIX en la que todas las abejas trabajadoras pueden enviar actualizaciones periódicas al mantenedor de estado. ¿Mi problema? Una cola de mensajes POSIX debe tener un nombre. No quiero elegir un nombre; lo único que me importa es obtener una cola de mensajes única, de forma muy similar a como usaría colas de mensajes SYSV con IPC_PRIVATE. Para un único nombre de archivo podría usar mkstemp(3) o para un descriptor de archivo abierto único podría usar tmpfile(3). ¿Cómo debo obtener una cola de mensajes POSIX única?¿Cómo obtener una cola de mensajes POSIX única?

Respuesta

3

no quiero escoger un nombre; todo lo que importa es conseguir una única cola de mensajes, tanto como lo haría el uso de colas de mensajes SYSV con IPC_PRIVATE

Bueno, con colas de mensajes POSIX, hace necesario especificar un nombre, pero no tiene para preservarlo ni permitir que otros usen la misma cola con ese nombre.

IPC_PRIVATE mímica

Haz lo mkstemp y tmpfile lo hacen bajo el capó. Pida prestado cualquiera de los algoritmos de selección de nombre "tmp"/"temp" para generar algo "/ reasonably_unique", mq_open O_CREAT | O_EXCL, y luego mq_unlink. Los procesos de trabajo infantil pueden heredar el descriptor de la cola de mensajes.

Advertencia: ¿Podría root o su EUID ido pícaro averiguar lo que está haciendo y saltar entre el mq_open y el mq_unlink? Sí.

implementación alternativa

alternativa, puede utilizar un SOCK_DGRAM socketpair o pipe su lugar. Los que ofrecen una semántica similar a las colas de mensajes POSIX — attr.mq_msgsize se convierte en SO_SNDBUF/SO_RCVBUF o un acuerdo para respetar PIPE_BUF, mq_notify se convierte en la capacidad de selección de E/S (probablemente ya sea el caso) — aunque se pierde la priorización de mensajes.

Cuestiones relacionadas