Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89

Межпроцессное взаимодействие, посредством использования общей памяти, как исправить ошибку?

10.06.2012, 12:07. Показов 1665. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно: Написать консольное приложение, которое ожидает от пользователя ввод текстовой строки, создаёт общий сегмент памяти заданного размера, заносит туда введенную строку и ожидаёт нажатие любой клавиши от пользователя для завершения работы;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <sys/shm.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
 
#define SIZE        4096
#define KEY     64321
 
#define SIZE        4096
#define KEY     64321
 
int stroka() {
   char m;
   cout<<"vvedite";
   cin>>m;
   return m;
}
int main(void){
    int id;
    int size;
    struct shmid_ds ds;
    int *buf;
 
    id = shmget (KEY, SIZE, IPC_CREAT | IPC_EXCL | 0600); //создаём общий сегмент
    if (id == -1){
        fprintf(stderr, "Cannot create segment memory!\n");
        _exit (1);
    };
 
    buf = (int *) shmat(id, NULL, 0);// помещаем созданный сегмент в адресное пространство процесса
    if (buf == (int *)  -1){
        fprintf(stderr, "Cannot active segmet memory!\n");
        _exit (1);
    }
    
 
    shmctl (id, IPC_STAT, &ds);         // получаем информацию о созданном сегменте
    size = ds.shm_segsz;
 
    if (size<sizeof(*buf)){
        fprintf(stderr,"Cannot move data in segmet because his size %d < size data \n", size, sizeof(*buf) );
        _exit(1);
    }
 
    *buf= stroka();     // заносим строку в общий сегмент
    
    fprintf(stdout,"Segment id: %d\n",id);
    fprintf(stdout,"Random number: %d\n",*buf);
    fgetc(stdin);       // ожидаем нажатие клавиши от пользователя
    shmdt(buf);     //  выгружаем сегмент из адресного пространства процесса
    shmctl(id, IPC_RMID, NULL);   // удаляем сегмент
    return 0;
};
Выводит след.ошибки в терминале:
C++
1
2
3
4
5
6
tymrfik@petek ~ $ g++ 41.cpp -o 41
41.cpp: In function ‘int stroka():
41.cpp:15: error:cout’ was not declared in this scope
41.cpp:16: error:cin’ was not declared in this scope
41.cpp: In function ‘int main():
41.cpp:43: warning: format ‘%d’ expects type ‘int’, but argument 4 has type ‘long unsigned int
По идеи я понимаю что нужно через fprintf fscanf работать как-то. но я совсем новичок в этом и толком не знаю где найти верные идеи. подскажите как переисать функцию stroka ?

Добавлено через 45 минут
Исправил кое-чего. Решил попробовать с константой-строкой. но сейчас терминал выдал другие ошибки! тут по типам string и char несоответствен!!!! помогите?!!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <sys/shm.h>
#include <fcntl.h>
#include <unistd.h>
#include <string>
 
#define SIZE        4096
#define KEY     64321
#define MESS "Hello"
 
int main(void){
    int id;
    int size;
    char *buf;  
    struct shmid_ds ds;
 
    id = shmget (KEY, SIZE, IPC_CREAT | IPC_EXCL | 0600); //создаём общий сегмент
    if (id == -1){
        fprintf(stderr, "Cannot create segment memory!\n");
        _exit (1);
    };
 
    buf = (char *) shmat(id, NULL, 0);// помещаем созданный сегмент в адресное пространство процесса
    if (buf == (char *)  -1){
        fprintf(stderr, "Cannot active segmet memory!\n");
        _exit (1);
    }
    
 
    shmctl (id, IPC_STAT, &ds);         // получаем информацию о созданном сегменте
    size = ds.shm_segsz;
 
    if (size<strlen(MESS)){
        fprintf(stderr,"Cannot move data in segmet because his size %d < size data \n", size, strlen(MESS) );
        _exit(1);
    }
 
    strcpy(buf, MESS);      // заносим случайное число в общий сегмент
    
    fprintf(stdout,"Segment id: %d\n",id);
    fprintf(stdout,"Random number: %d\n",*buf);
    fgetc(stdin);       // ожидаем нажатие клавиши от пользователя
    shmdt(buf);     //  выгружаем сегмент из адресного пространства процесса
    shmctl(id, IPC_RMID, NULL);   // удаляем сегмент
    return 0;
};
Ошибки:
C++
1
2
3
4
5
tymrfik@petek ~ $ g++ 41.cpp -o 41
41.cpp: In function ‘int main():
41.cpp:33: error:strlen’ was not declared in this scope
41.cpp:38: error:strcpy’ was not declared in this scope
tymrfik@petek ~ $
Добавлено через 19 минут
что-то поспешил я создавать тему, разрулил все, можете удалять.

Добавлено через 19 минут
Полезная информация: помогла мне книжка "Программирование в Linux. Самоучитель. / Н.Н.Иванов. - Спб.: БХВ-Петербург, 2007. - 416 с." - в ней есть код!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.06.2012, 12:07
Ответы с готовыми решениями:

Попытка инициализации std::vector посредством brace-enclosed initializer list вызывает ошибку: как это можно исправить?
При создание вектора, пытаюсь сразу задать начальные значения: std::vector&lt;int&gt; c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; но компилятор (MinGW...

Межпроцессное взаимодействие
Здравствуйте. Пытаюсь на чистом СИ записать информацию в канал и считать оттуда в двух разных процессах. Почему-то записывает одно, а...

Межпроцессное взаимодействие
Всем привет. Нужна помощь в организации следующей схемы. У меня есть программа в которой мне нужно считывать данные с ее диалоговых...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.06.2012, 12:07
Помогаю со студенческими работами здесь

Межпроцессное взаимодействие
решаю задачу 2 процесса работают с буффером в разд. памяти. Один пишет в буфер введенный в консоль текст, второй читает из буффера в...

Межпроцессное взаимодействие
Доброго времени суток. Есть демон и есть большой проект. Хочу организовать межпроцессное взаимодействие для вызова из демона одного...

Межпроцессное взаимодействие
Здравствуйте. Есть необходимость перебрасывать информацию между двумя приложениями. Для этого использую TCP/IP. Клиент шлёт команду: ...

Межпроцессное взаимодействие
Здравствуйте. Подскажите пожалуйста, как лучше и проще будет организовать межпроцессное взаимодействие. Есть динамическая библиотека...

Межпроцессное взаимодействие
Здравствуйте, подскажите пожалуйста. Работаю в Unix, на чистом Си. Задача следующая: из моей программы нужно запустить новый процесс с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru