У меня есть несколько процессов, взаимодействующих с каждым через общую память POSIX в OS X.
Моя проблема в том, что эти процессы могут порождаться в любом порядке и пытаться инициализировать сегмент общей памяти одновременно.
Я пытался использовать консультативные блокировки с fcntl
и flock
, но оба не смогли сказать, что я передаю неверный дескриптор файла (я уверен, что дескриптор файла не является недействительным). Так ясно, что это за кадром.
Есть ли альтернативы этому? Или есть какие-то подробности об использовании замков с разделяемой памятью, о которых я не знаю?
Edit:
Моя попытка использования замков выглядит так:
// Some declarations...
struct Queue {
int index[ENTRIES_PER_QUEUE];
sem_t lock;
sem_t readWait;
sem_t writeSem;
struct Entry slots[ENTRIES_PER_QUEUE];
};
struct ipc_t {
int fd;
char name[512];
struct Queue* queue;
};
ipc_t ipc_create(const char* name, int owner) {
int isInited = 1;
struct Queue* queue;
struct flock lock = {
.l_type = F_WRLCK,
.l_whence = SEEK_SET,
.l_start = 0,
.l_len = 0
};
ipc_t conn = malloc(sizeof(struct ipc_t));
sprintf(conn->name, "/arqvenger_%s", name);
conn->fd = shm_open(conn->name, O_CREAT | O_RDWR, 0666);
if (conn->fd == -1) {
free(conn);
perror("shm_open failed");
return NULL;
}
if (fcntl(conn->fd, F_SETLKW, &lock) == -1) {
perror("Tanked...");
}
// Do stuff with the lock & release it
Вывод, который я получаю:
Tanked...: Bad file descriptor