Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для v1le
15 / 12 / 1
Регистрация: 01.06.2011
Сообщений: 225

Процессы и каналы

07.06.2013, 04:20. Показов 2793. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
Есть задание
Написать программу для нахождения наибольшего по модулю элемента матрицы. Матрица вводится из файла. Поиск наибольшего элемента в каждой строке матрицы выполнить в отдельных процессах. Для передачи данных в родительский процесс использовать механизм неименованного канала (pipe).
Всё понятно, кроме того, что выделено жирным, примерно понимание есть, но как реализовать как - не понимаю.

Подскажите, пожалуйста. Мне код не нужен, хотя бы словами)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2013, 04:20
Ответы с готовыми решениями:

С++ под Linux, процессы fork() и каналы
Вот такая штука... Нужно, так сказать, организовать общение между процессами через полудуплексный неименованный канал =) Научился...

Процессы и именованные каналы
Подскажите пожалуйста, если можно примером кода или его наброском. Так же можно сбросить по возможности сайты с примерами. Нужно с...

Замирает компьютер, все процессы замораживаются, но курсор передвигается и некоторое время можно переключатся на другие процессы
Добрый Вечер. Суть проблемы, собрал компьютер на базе: CPU: AMD FX-8320 Mать: AsRock 990FX Extreme3 Видео: AMD RADEON HD6950 ...

4
36 / 38 / 7
Регистрация: 01.06.2011
Сообщений: 237
07.06.2013, 09:30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i=0;i<nrows; i+=1){
  pid[i]=fork();
  if(pid[i]==0){
    находимся в i-м дочернем процессе
    ищем наибольший элемент в i-ой строке
    
    передаем в pipe номер строки и наибольший элемент
    exit(0) // выходим из дочернего процесса
    } 
  }
  // а здесь родительский процесс, никакой дочерний не доходит
  открываем pipe
  читаем из него nrows-раз и формируем массив наибольших элементов
1
 Аватар для v1le
15 / 12 / 1
Регистрация: 01.06.2011
Сообщений: 225
07.06.2013, 10:37  [ТС]
Цитата Сообщение от dstat Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i=0;i<nrows; i+=1){
  pid[i]=fork();
  if(pid[i]==0){
    находимся в i-м дочернем процессе
    ищем наибольший элемент в i-ой строке
    
    передаем в pipe номер строки и наибольший элемент
    exit(0) // выходим из дочернего процесса
    } 
  }
  // а здесь родительский процесс, никакой дочерний не доходит
  открываем pipe
  читаем из него nrows-раз и формируем массив наибольших элементов
Сделал как вы сказали, но массив максимальных чисел получается повторением максимумов 1 строки, т.е.
если есть матрица
1 3
2 5
То массив максимальных чисел:
3 3
Видимо проблема в exit(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
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
 
 
using namespace std;
 
 
 
int main(){
    int fd[2];
    int i,j;
    int p[2];
    int arr[2][2];
    int marr[2];
    FILE *file = fopen("matrix","r");
    if (!file)
        printf("NO FILE");
    for(i = 0; i < 2; i++){
        for(j = 0; j < 2; j++){
            fscanf(file, "%d", &arr[i][j]);
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
 
    if(pipe(fd) < 0) {
        printf("Pipe error!\n");
        return 1;
    }
    int max=arr[0][0];
 
    for (int i=0; i<2; i+=1){
        p[i]=fork();
        if(p[i]==0){
            for(j=0; j<2; j++){
                if(max<arr[i][j]){
                    max=arr[i][j];
                    }
                }
            close(fd[0]);
            write(fd[1],&max,sizeof(int));
            write(fd[1],&i,sizeof(int));
            exit(0);
        }
        else{
            close(fd[1]);
            for(int k=0; k<2; k++){
                read(fd[0],&max,sizeof(int));
                read(fd[0],&i,sizeof(int));
                marr[i]=max;
            }
        }
    }
   printf("massiv max:\n");
    for(i=0; i<2; i++){
        printf("%d\n",marr[i]);
    }
    fclose(file);
    return 0;
}
Подскажите, пожалуйста, что не так.
0
36 / 38 / 7
Регистрация: 01.06.2011
Сообщений: 237
07.06.2013, 11:38
у меня вот так получилось. +чтобы было понятнее, при отладке многопроцессных/многопоточных задач используйте отладочную печать. и тайное становится явным
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
 
 
using namespace std;
 
 
 
int main(){
    int fd[2];
    int i,j;
    int p[2];
    int arr[2][2];
    int marr[2];
    FILE *file = fopen("matrix","r");
    if (!file)
        printf("NO FILE");
    for(i = 0; i < 2; i++){
        for(j = 0; j < 2; j++){
            fscanf(file, "%d", &arr[i][j]);
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
 
    if(pipe(fd) < 0) {
        printf("Pipe error!\n");
        return 1;
    }
    int max=arr[0][0];
 
    for (int i=0; i<2; i+=1){
        p[i]=fork();
        if(p[i]==0){
        printf("%d subprocess\n", i);
        max=arr[i][0];
            for(j=0; j<2; j++){
                if(max<arr[i][j]){
                    max=arr[i][j];
                    }
                }
            close(fd[0]);
        printf("write to pipe: max=%d i=%d\n", max, i);
            write(fd[1],&max,sizeof(int));
            write(fd[1],&i,sizeof(int));
            exit(0);
        }
        else{
           
        }
    }
 close(fd[1]);
            for(int k=0; k<2; k++){
                read(fd[0],&max,sizeof(int));
                read(fd[0],&i,sizeof(int));
        printf("read from pipe: max=%d i=%d\n", max, i);
                marr[i]=max;
            }
   printf("massiv max:\n");
    for(i=0; i<2; i++){
        printf("%d\n",marr[i]);
    }
    fclose(file);
    return 0;
}
1
 Аватар для v1le
15 / 12 / 1
Регистрация: 01.06.2011
Сообщений: 225
07.06.2013, 12:13  [ТС]
Я был рядом )
Большое спасибо !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2013, 12:13
Помогаю со студенческими работами здесь

Процессы с адм. правами и незакрываемые процессы
Доброго времени суток. Появилась необходимость создать незакрываемый процесс. Такое вообще возможно? Если нет, то возможно ли осуществлять...

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

Каналы
Пусть у меня есть два потока. Обменивающиеся сообщениями посредством каналов Chan если пытаться считать из канала в который никто никогда...

Каналы
Ребята, прошу помощи в решении данной задачи: Клиент принимает с клавиатуры команды и передает их серверу. Сервер выполняет принятые...

Каналы связи
Уважаемые форумрчане, действительно необходима помощь в решении задачи. Вот ее условие: В канал связи передаются сообщения длиной n=12...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru