создание общей памяти posix в потоке - PullRequest
0 голосов
/ 30 ноября 2018

Я новичок в программировании на Linux, поэтому, пожалуйста, будьте осторожны!. scenario description

Я пытаюсь реализовать вышеуказанный сценарий.Здесь два процесса создаются с использованием 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.

Возможно ли создание сегментов общей памяти между процессами, когда они создаются из другого процесса / потока?Любые идеи о том, как я могу заставить это работать?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Сегмент разделяемой памяти должен быть открыт в обоих процессах.

Если оба процесса созданы с помощью fork() из общего родителя, то вы можете просто сделать shm_open() перед fork(),и он будет унаследован обоими дочерними процессами.

В качестве альтернативы каждый процесс может вызывать shm_open(), передавая одно и то же значение для параметра name.

0 голосов
/ 30 ноября 2018

если вы пытаетесь получить доступ к дескриптору файла, созданному другим процессом, он не будет работать.Файловые дескрипторы хороши только в том процессе, в котором они были созданы. Я говорю это только из-за ошибки, которую вы видите.

Но у вас есть правильная идея для совместного использования памяти, вы можете сделать общий сегмент сопоставленногопамятью обоим процессам, что может стать проблематичным из-за состязаний с несколькими потоками в каждом процессе, конкурирующими за доступ к нему, или вы можете создать сокет, и ваши два процесса будут обмениваться данными через него или канал.

Iрекомендую сокет AF_UNIX для IPC, как вы пытаетесь достичь.

...