Я новичок в программировании на Linux, поэтому, пожалуйста, будьте осторожны!.
Я пытаюсь реализовать вышеуказанный сценарий.Здесь два процесса создаются с использованием fork()
каждый с N числом потоков.Потоки из процесса 1 создают запрос и помещают его в очередь 1. Потоки из процесса 2 снимают запрос с запроса и отправляют ответ обратно в очередь 2. Каждый запрос состоит из shmid
и size
, где shmid
является общей памятьюсгенерированный таким образом сегмент -
shmid = shm_open(<a random string>, O_CREAT | O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG);
if (shmid < 0) {
perror("failure on shm_open");
exit(1);
}
if (ftruncate(*share, size) == -1) {
perror("Error on ftruncate\n");
exit(-1);
}
Я могу открыть и изменить этот сегмент совместно используемой памяти сразу в том же потоке после создания, используя
void* request = mmap(NULL, size, PROT_WRITE, MAP_SHARED, shmid, 0);
memset(str, 'w', size);
После этого я передаю Шмидпроцесс 2 с использованием очереди 1.
Моя проблема заключается в том, что, когда потоки в процессе 2 пытаются открыть этот shmid таким же способом, я получаю ошибку EBADF: fd is not a valid file descriptor
.Я убедился, что shmid верен после удаления из очереди, напечатав значение в обоих процессах 1 и 2.
Возможно ли создание сегментов общей памяти между процессами, когда они создаются из другого процесса / потока?Любые идеи о том, как я могу заставить это работать?
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.