Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160

Доступ процессов к общей области памяти

07.04.2014, 11:41. Показов 2236. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно посчитать сумму значений, которые код генерирует . наскрёб из гугла такое решение, но вылазит "segmentation fault", походу когда пытаюсь одновременно ( *m++ || *s += i) получить доступ к сегменту .
как решить этот вопрос ? возможно что то вроде очереди запросов можно организовать ?
и вообще, насколько этот код корректен ? может возможно как то более правильно написать ?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
shmid_1 = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
shmid_2 = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
for (j = 1; j < n; j++) {
    if (fork() == 0) break;
    i++; 
}
  
s = shmat(shmid_1, (void *) 0, 0);
m = shmat(shmid_2, (void *) 0, 0);
 
*m++;
*s += i; 
  
shmctl(shmid_1, IPC_RMID, 0);
shmctl(shmid_2, IPC_RMID, 0);
wait();
if (*m == n) printf("%i\n", *s);
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2014, 11:41
Ответы с готовыми решениями:

Количество процессов, подсоединенных к разделяемой области памяти в текущий момент
Уважаемые гуру пользователи, как показать количество процессов, подсоединенных к разделяемой области памяти в текущий момент?

Доступ к области памяти из другого класса
Есть класс в котором создаётся область в памяти, как получить из другого класса доступ к этой облпсти в возможностью перезаписи? В примере...

Managed уязвимость - доступ к любой области памяти!
Сейчас я говорю о 32-битных системах, но в 64 все тоже может работать с небольшими отличиями. .NET гарантирует, что операции записи...

9
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
07.04.2014, 18:05
Лучший ответ Сообщение было отмечено luciys как решение

Решение

1.Не учтен порядок выполнения в строке 11, если, конечно, это не особая задумка.
2. Чтобы printf выдал что-то правдоподобное, хотя бы задержки времени нужно поставить.
Где приведенный участок может вызвать сегментейшин фаулт, я не увидел, разве что в *m потом что-то записывается.
Ниже приведенный код работает, вроде бы, ожидаемо.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main() {
  int i, n=3;
  int shmid_1 = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
  int shmid_2 = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
 
  for (i = 0; i < n; i++) if (!fork()) break;
 
  int *s = shmat(shmid_1, (void *) 0, 0);
  int *m = shmat(shmid_2, (void *) 0, 0);
 
  sleep (i);
  (*m)++;
  *s += i;
  if (i == n) {
    for (i=0; i < n; i++) wait();
    shmctl(shmid_1, IPC_RMID, 0);
    shmctl(shmid_2, IPC_RMID, 0);
  }
  if (*m == n) printf("%i\n", i, *s);
  printf("%i: %i %i\n", i, *m, *s);
}
1
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
07.04.2014, 22:49  [ТС]
gng, с паузой я уже делал, но мне бы без задержек .
так, сама задача . я ищу все файлы в заданной директории и мне нужно запустить n процессов, которые будут просматривать эти файлы и подсчитывать количество каждого символа . т.е. они должны получать доступ к переменной(где результат хранится) по очереди, если я конечно не изобретаю велосипед =)
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
07.04.2014, 23:13
Пауза вставлена для адекватного просмотра чере принтф. Счетчики должны правильно работать и без них.
0
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
07.04.2014, 23:30  [ТС]
gng, я понимаю =)
но ошибка всё таки есть . кстати, с паузой её не выдаёт же .
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
07.04.2014, 23:35
Какая ошибка без паузы?
В вашем коде или в моем?
0
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
08.04.2014, 09:35  [ТС]
gng, Ваш код без паузы работает как нужно ) спасибо .
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
08.04.2014, 12:05
luciys, на всякий случай напомню, что без синхронизации (напр. семафоры) результат может быть не точным.
0
6 / 6 / 1
Регистрация: 27.11.2012
Сообщений: 160
08.04.2014, 14:35  [ТС]
gng, во, скорее всего мне это и необходимо )
насколько это критичный в моей ситуации вопрос ? это обусловлено количеством процессов, которые одновременно получают доступ к участку памяти ? и как вообще может происходить одновременный доступ, по-моему это невозможно ), ос сама выстраивает очерёдность или тут другая "магия" ?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
08.04.2014, 16:09
Цитата Сообщение от luciys Посмотреть сообщение
насколько это критичный в моей ситуации вопрос ? это обусловлено количеством процессов, которые одновременно получают доступ к участку памяти ?
Если нужно получить точный результат и количество процессов больше одного, то критично.
Я попробовал набросать тестовый черновой вариант вашей задачи для случая всех текстовый файлов в /etc (для каждого файла - отдельный процесс). Получилось на моих четырех ядрах для каждой буквы +-0.2%. Считал только строчные буквы от 'a' до 'z'. После добавления семафора счет стал точным, но скорость немного упала.
Цитата Сообщение от luciys Посмотреть сообщение
и как вообще может происходить одновременный доступ, по-моему это невозможно ), ос сама выстраивает очерёдность или тут другая "магия" ?
Зависит от особенностей ядра, и от архитектуры.

Получилось что-то такое.
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
 
main() {
  int i, c, n=0;
  int *cm;
  int shmid = shmget(IPC_PRIVATE, sizeof(int) * ('z'-'a'+1), IPC_CREAT | 0666);
  int semid = semget(IPC_PRIVATE,1,IPC_CREAT | 0666);
  semctl(semid,0,SETVAL,1);
  struct sembuf semwait= {0, -1, SEM_UNDO};
  struct sembuf semup= {0, 1, SEM_UNDO};
  char s[128];
  for (i = 0; fgets (s, sizeof (s), stdin); i++) {
    if (s[strlen (s) -1] = '\n') s[ strlen(s) -1]= 0;
    ++n;
    if (!fork()) break;
  }
  if ( i < n) {
    FILE *f= fopen (s, "r");
    if (!f) return -1;
    cm = shmat(shmid, 0, 0);
 
    semop (semid, &semwait, 1);
    while ((c= fgetc (f)) != EOF) if ( c >= 'a' && c <= 'z') ++(cm [c-'a']);
    semop (semid, &semup, 1);
    shmdt (cm);
    fclose (f);
  }
  else {
    for (i=0; i < n; i++) wait();
    cm = shmat(shmid, 0, 0);
    for (i= 'a'; i <= 'z'; i++)
      printf ("%c: %d\n", i, cm[i-'a']);
    shmdt (cm);
    shmctl(shmid, IPC_RMID, 0);
    semctl(semid,0,IPC_RMID);
  }
}


Проверял
Bash
1
find /etc -maxdepth 1 -name "*.conf" -type f | ./a.out
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2014, 16:09
Помогаю со студенческими работами здесь

Доступ к общей папке
Доброго времени суток. Раздумываю о написании своей программы для доступа к общим локальным папкам (что-то типа Samba). Задача: получить...

доступ к общей папке
подскажите как сделать... имеется виндовс сервер 2008r2 на нем разшарены сетевые папки в сети около 18 арм с виндовс xp и на большинства...

Общей доступ сетях Windows 7
Здраствуйте, у меня есть такая проблема. 2 компа, содинения на прямую, ОС Виндовс7 32-розрядная на одном и 64 на втором. 32-х видит файлы...

Пропал доступ к общей папке
Всем доброго дня. Имеется Windows Server 2008R2 с расшаренной на нем папкой и клиентская машина на Windows 7 X64..После переустановки...

Отключается доступ к общей папке.
Люди подскажите на Win 2003 стоит общая папка сетка из 15 компов периодически общая папка перестает быть доступно и некто на неё...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru