Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Передача сообщений между процессами (mmap)  (Прочитано 1708 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Macht59

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Напишите пожалуйста простенький пример или дайте ссылку на мануал, потому что я сам уже окончательно запутался  :-[

P.S. Компилятор g++. ОС Ubuntu 10.04 desktop i386.

Пользователь решил продолжить мысль 13 Ноября 2010, 12:12:03:
Вот что я имею на данный момент:

Программа, которая посылает сообщение:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define FILE_LENGTH 0x100

int main (int argc, char* const argv[])
{
int fd;
void* file_memory;
/* Открываем(создаем) файл */         
fd = open (argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
/* Создаем отображение в памяти. */         
file_memory = mmap (0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
/* Пишем сообщение */     
sprintf((char*) file_memory, "%s\n", "Я сообщение ");
system("receiver.bin");//Запускается прогамма, которая должна прочитать строку
/* Освобождаем память. */
munmap (file_memory, FILE_LENGTH);
return 0;
}

Та, что получает строку:

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define FILE_LENGTH 0x100
int main (int argc, char* const argv[])
{
int fd;
void* file_memory;
char str[50];
/* Открыть файл. */
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR);
/* Отобразить файл в память.  */
file_memory = mmap (0, FILE_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
/* Чтение  */
scanf (file_memory, "%s", &str);
return 0;
}
« Последнее редактирование: 13 Ноября 2010, 18:13:31 от Macht59 »
Ubuntu 10.10 | AMD Athlon II X3 3100+ | 4 Gb RAM | ATI 5770

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #1 : 13 Ноября 2010, 18:45:42 »
А это обязательно делать с помощью mmap? Может лучше через Unix-сокеты?

Оффлайн Macht59

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #2 : 13 Ноября 2010, 22:56:55 »
А это обязательно делать с помощью mmap? Может лучше через Unix-сокеты?

Нужно разобраться именно с этим способом.
Ubuntu 10.10 | AMD Athlon II X3 3100+ | 4 Gb RAM | ATI 5770

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #3 : 13 Ноября 2010, 23:11:20 »
Посмотрите книгу Уильям Стивенс, Unix: взаимодействие процессов.

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #4 : 14 Ноября 2010, 09:46:50 »
А если поменять порядок строк...
   
sprintf((char*) file_memory, "%s\n", "Я сообщение ");
system("receiver.bin");//Запускается прогамма, которая должна прочитать строку

на

system("receiver.bin");//Запускается прогамма, которая должна прочитать строку
sprintf((char*) file_memory, "%s\n", "Я сообщение ");
« Последнее редактирование: 14 Ноября 2010, 09:48:26 от maximum2000 »

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #5 : 14 Ноября 2010, 10:41:36 »
Читающая программа, судя по всему, запускается без аргумента:
system("receiver.bin");

А внутри себя она этот аргумент использует:
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR);

Быть может, проблема в этом?
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #6 : 14 Ноября 2010, 14:40:23 »
Вообщем получилось как-то так.
Код: (sender.c) [Выделить]
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

#define FILE_LENGTH 0x100

int main()
{
void *file_memory;
int fd = open("file", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);

file_memory = mmap(0, FILE_LENGTH, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
close(fd);

sprintf((char*) file_memory, "%s\n", "Hello!");
msync(file_memory, FILE_LENGTH, MS_SYNC);

system("./receiver");
munmap(file_memory, FILE_LENGTH);
exit(0);
}
Код: (receiver.c) [Выделить]
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define FILE_LENGTH 0x100
int main (int argc, char* const argv[])
{
int fd;
void* file_memory;
char str[50];

fd = open ("file", O_RDWR, S_IRUSR | S_IWUSR);

file_memory = mmap (0, FILE_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);

sscanf(file_memory, "%s", str);
printf("%s\n", str);
return 0;
}
Файл, отображаемый в память не должен быть нулевой длины, иначе программа будет падать с SIGBUS, я его забил на 256 байт нулями.
« Последнее редактирование: 14 Ноября 2010, 15:13:49 от hippi90 »

Оффлайн Macht59

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #7 : 14 Ноября 2010, 18:59:41 »
Вообщем получилось как-то так.
Код: (sender.c) [Выделить]
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

#define FILE_LENGTH 0x100

int main()
{
void *file_memory;
int fd = open("file", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);

file_memory = mmap(0, FILE_LENGTH, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
close(fd);

sprintf((char*) file_memory, "%s\n", "Hello!");
msync(file_memory, FILE_LENGTH, MS_SYNC);

system("./receiver");
munmap(file_memory, FILE_LENGTH);
exit(0);
}
Код: (receiver.c) [Выделить]
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define FILE_LENGTH 0x100
int main (int argc, char* const argv[])
{
int fd;
void* file_memory;
char str[50];

fd = open ("file", O_RDWR, S_IRUSR | S_IWUSR);

file_memory = mmap (0, FILE_LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);

sscanf(file_memory, "%s", str);
printf("%s\n", str);
return 0;
}
Файл, отображаемый в память не должен быть нулевой длины, иначе программа будет падать с SIGBUS, я его забил на 256 байт нулями.

Спасибо большое за ответ!

Вторая прога не компилилась из-за ошибки в строке sscanf(file_memory, "%s", str); заменил на sscanf((char*)file_memory, "%s", str);. Компилирование прошло успешно.
Но увы после запуска получил ошибку Bus Error.

Читал книгу, которую Вы порекомендовали. Там немного другой подход к решению этой задачи. Тем не менее попробовал, но столкнулся с проблемами связанными с unpipc.h (успел ее за это время возненавидеть :)).

P.S. На сегодня хватит программирования (уже сижу восемь часов). Продолжу завтра.
Ubuntu 10.10 | AMD Athlon II X3 3100+ | 4 Gb RAM | ATI 5770

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #8 : 14 Ноября 2010, 19:58:47 »
Но увы после запуска получил ошибку Bus Error.
Bus Error возникает из-за того, что файл, который вы отображаете в память имеет нулевую длинну. Я сделал так
dd if=/dev/zero of=file count=1 bs=256И потом уже с этим файлом можно работать.
Я этот код собирал и проверял на своей системе, всё работало.

Оффлайн Macht59

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: Передача сообщений между процессами (mmap)
« Ответ #9 : 15 Ноября 2010, 16:57:21 »
Но увы после запуска получил ошибку Bus Error.
Bus Error возникает из-за того, что файл, который вы отображаете в память имеет нулевую длинну. Я сделал так
dd if=/dev/zero of=file count=1 bs=256И потом уже с этим файлом можно работать.
Я этот код собирал и проверял на своей системе, всё работало.

А таки работает :)
Спасибо!
Ubuntu 10.10 | AMD Athlon II X3 3100+ | 4 Gb RAM | ATI 5770

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.