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

Межпотоковое взаимодействие с использованием разделяемой памяти и неименованных каналов

04.05.2012, 11:09. Показов 3184. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят возникла следующая проблема..
Нeoбходимo сoздать 3 потoка. 1 глaвный и 2 дополнительных. У потока на вхoде текстoвый файл.
Задача главного потова считывать этот файл и передавать егo блoками в другие потоки, причем: 1доп потoк получает данные через память(ему также необходимо подсчитать количество символов в этом файле), а 2й доп пoтoк через неименные каналы(этому необходимо посчитать количество строк).

Вот чего я в итоге добился
мой код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h> 
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <errno.h>
#define BLOCK_SIZE 128
 
void tsa (char * x)
{
    printf("\t");
    printf(x);
    printf("\n");
}
 
  sem_t sem;// переменная семафора
 
  void thread_func_mem (void *param);
  void thread_func_pipe(void *param);
 
  int pipe_fd[2] = {0};
    
int main()
{   
    // открытие файла
    FILE * fd = fopen("file2.txt", "r");
    
    if(fd == NULL)  
    {
        tsa("!Error! Can't to open file.");
        return 0;
    }
    tsa("File has opened");
    
    // создание разделяемой памяти
    // создание и открытие разделяемой области памяти
    size_t BUFFER_SIZE = BLOCK_SIZE * sizeof(wchar_t) + sizeof(size_t);     // определения размера буфера
    int shmid = shmget(IPC_PRIVATE, BUFFER_SIZE, IPC_CREAT|0666);   
    
    if(shmid == -1)
    {
        tsa("!Error! Shared memory has not been created!");
        return 0;
    }
    tsa("Segment has created");
 
    // создание pipe
    if(pipe(pipe_fd) != 0)
    {
        tsa("!Error! Pipe has not been created!");
        return 0;
    }
    tsa("Pipe has created");
 
    // создание семафора
    sem_init(&sem, 0, 1);
    //sem_wait(&sem);
    
    tsa("Semaphore has initialised");
    
    // создание потоков
    pthread_t ids[2];
 
    pthread_create(&ids[0], 0, (void *)thread_func_mem, (void *)&shmid);// создание потока
    pthread_create(&ids[1], 0, (void *)thread_func_pipe, (void*)&pipe_fd[1]);
  
    tsa("Threads has created");
    
    // начало работы с данными файла
    wchar_t * new_seg = (wchar_t *)shmat(shmid, 0, 0);
 
    if(new_seg == (void *)(-1))
    {
        tsa("Error:A new segment has not been");
        return 0;
    }
 
    tsa("Start of reading from file...");
    while(!feof(fd))
    {   
        size_t count = fread(new_seg + sizeof(size_t), sizeof(wchar_t), BUFFER_SIZE, fd);
        memcpy(new_seg, &count, sizeof(count));
 
        write(pipe_fd[1], new_seg, BUFFER_SIZE);
 
        sem_post(&sem);     // увеличивает значение семафора на 1
        sem_wait(&sem);     // уменьшает значение семафора на 1
    }
    tsa("End of reading from file");
}
 
// функция чтения потока из памяти
// -------------------------------
void thread_func_mem(void *param)
{
    int id;
    tsa("Thread of memory has created");
    
    sem_wait(&sem);
    
    id = *(int*)param;
    void * seg = (wchar_t *) shmat(id, NULL, 0);
    
    tsa("Znacheniya peredani");
    
    size_t size = (size_t) seg;
 
    wchar_t * buff[size];
 
    memcpy(buff, &seg, size);
    //memcpy(buff, seg + sizeof(size_t), size);
    //memcpy(&size, seg, sizeof(size_t));
    
    sem_post(&sem);
    tsa("Buffer gotov");
    // .......buff
    int CountOfSpaces = 0;
    int iSize = size;
    int i = 0;
    
    while (i<iSize)
    {
      if ((void *)buff[i] == "")
      CountOfSpaces++;
      i++;
      
    }
        tsa("Chislo probelov: %c"),CountOfSpaces;    
}
 
// функция потока чтения из pipe
// -----------------------------
void thread_func_pipe(void *param)
{
    tsa("Thread of pipe has created");
    
    int i = 0;
    int count = 0;
    //int pipe_fd;
    wchar_t * buf;
  
    while (read(pipe_fd[0], (void *)&buf, 1) > 0)
    {
        if ((void *)buf[i]=="\n")
        count++;
        i++;
    }
}
Это результат
Bash
1
2
3
4
5
6
7
File has opened
        Segment has created
        Pipe has created
        Semaphore has initialised
        Threads has created
        Start of reading from file...
        End of reading from file
И все.. Больше ничего не происходит... Не могу понять что ему надо...
Вот еще.. gdb мне очень помог:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
[Thread debugging using libthread_db enabled]
        File has opened
        Segment has created
        Pipe has created
        Semaphore has initialised
[New Thread 0xb7feab70 (LWP 19121)]
        Thread of memory has created
        Znacheniya peredani
 
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7feab70 (LWP 19121)]
0x08048b5c in thread_func_mem (param=0xbffff114) at prob.c:118
118             memcpy(buff, &seg, size);

Да да да.. показывает строчку где ошибка.. но как сделать так чтобы программа заработала я ума не приложу...
Подскажите.. Заранее благодарен...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2012, 11:09
Ответы с готовыми решениями:

Использование неименованных каналов, заданных явным образом
Добрый вечер, у меня не получается вывести трубу неименованного канала. Использование неименованных каналов, заданных явным образом. ...

Прогон программ с использованием разделяемой памяти
/* Мы организуем разделяемую память для массива из трех целых чисел. Первый элемент массива является счетчиком числа запусков программы...

Аська на основе разделяемой памяти
Прогреры и хакеры и им подобные... обращаюсь с особой просьбой: есть мысли по поводу перессылки сообщений через разделяемую память между...

1
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
09.05.2012, 08:24
Цитата Сообщение от Alexander26k Посмотреть сообщение
C
1
size_t size = (size_t) seg;
C
1
size_t size = *(size_t) seg;
в 115 строке попробуй так

Цитата Сообщение от Alexander26k Посмотреть сообщение
И все.. Больше ничего не происходит... Не могу понять что ему надо...
Вот еще.. gdb мне очень помог:
в коде полно ошибок
если не научишься писать без ошибок сразу, всегда будешь подолгу сидеть
не откладывай на потом то, что можно сделать сейчас
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2012, 08:24
Помогаю со студенческими работами здесь

Считать структуру из разделяемой памяти
Добрый день! Есть разделяемый файл. В приложении А в файл запихиваю структуру. В приложении Б считываю эту структуру из файла. Выдается...

Запись и считывание разделяемой памяти
Всем доброго времени суток. Столкнулся с одной проблемой. Есть две программы: 1 создаёт разделяемую память и записывает туда данные, а...

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

Синхронизация доступа к разделяемой памяти
Когда потоки являются дочерними по отношению к процессу тут все просто - объект мьютекса находится в общей памяти и используя этот объект...

Сделать массив из 10 int в разделяемой памяти
Хочу сделать массив из 10 int в разделяемой памяти. Доступ из разных процессов от fork(). Так понимаю, 19-20 строки должны сказать...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru