Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107

Полудуплексные каналы

19.01.2011, 17:16. Показов 1858. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сама программа с матрицами не сильно важна, а важен сам механизм передачи через каналы между программами, что не могу реализовать.

А) Определить является ли матрица А магическим квадратом. Входные
данные: целое положительное число n, массив чисел А размерности nxn.
Матрица является магическим квадратом, когда равны между собой
суммы всех строк и суммы всех столбцов. Использовать n или n+1
процессов для решения задачи.


В) Определить является ли каждый i-й элемент массива А больше i-го элемента массива В. Входные данные первого приложения: массив чисел А фиксированной размерности. Входные данные второго приложения: массив чисел B, той же размерности, что и массив А.

Программа А.
Здесь помогите исправить чтение из канала (в самом низу кода)
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
#include <stdio.h>
 
#include <iostream>
 
#include <sys/wait.h>
 
#include <unistd.h>
 
#include <fcntl.h>
 
 
using namespace std;
int main () 
{
 
    int x[10][10], i, j, k, n, st, check, fd[2];
    if(pipe(fd)==-1)
    {
        cout<<"Error of creating pipe!";
        return 0;
    }
 
    cout<<"Vvedite razmernost' kvadrata chisel: ";
 
    cin>>n;
 
    cout << "\nVvedite elementy kvadrata:\n";
 
    for (i = 1; i <= n; i++) {
 
        cout << "...dlya " << i << "-oy stroki:\n";
 
        for (j = 1; j <= n; j++) {
 
            cin >> x[i][j];
 
        }
 
    }
    if(fork()==0)
        {
            write(fd[1],&x,sizeof(int));
            return 1;
        }
 
    cout << "\nVvedyonnyy kvadrat:\n";
 
    for (i = 1; i <= n; i++) {
 
        for (j = 1; j <= n; j++) {
 
            cout << "\t" << x[i][j];
 
        }
 
        cout << "\n";
 
    }
 
    check = 0;
 
    for (i = 1; i <= n; i++) {
 
        for (j = 1; j <= n - 1; j++) {
 
            for (k = j + 1; k <= n; k++) {
 
                if (x[i][j] == x[i][k]) {
 
                    check++;
 
                }
 
            }
 
        }
 
    }
 
    for (j = 1; j <= n; j++) {
 
        for (i = 1; i <= n - 1; i++) {
 
            for (k = i + 1; k <= n; k++) {
 
                if (x[i][j] == x[k][j]) {
 
                    check++;
 
                }
 
            }
 
        }
 
    }
 
    if (check == 0) {
 
        cout << "\nVvedyonnyy kvadrat yavlyaetsya magicheskim.\n";
 
    } else {
 
        cout << "\nVvedyonnyy kvadrat ne yavlyaetsya magicheskim.\n";
 
    }
    read(fd[0],&x,sizeof(int));
    fprintf(stdout,"\nreading from pipe- %x  \n",sizeof(int)) ;
 
    getchar();
    close(fd[0]);
    close(fd[1]);
 
    return 0;
 
}
Программа В
Не читает размерность n из первой программы
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
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
using namespace std;
 
int main()
{
    int st,fd,n,*B;
    fd=open("mypipe",O_RDONLY);
    if(fd==-1)
    {
        cout<<"Error of opening fifo!";
        return 0;
    }
 
    read(fd,&n,sizeof(int));
    B=new int[n];
    for(int i=0; i<n; i++)
    {
        cout<<"Enter B["<<i+1<<"]=";
        cin>>B[i];
    }
    for(int i=0; i<n; i++)
    {
        int element;
        read(fd,&element,sizeof(int));
        if(B[i]<element)
        cout<<"\n"<<i+1<<" element massiva A bolshe elementa "<<i+1<<" massiva B ("<<element<<">"<<B[i]<<")";
    }
    close(fd);
    unlink("mypipe");
    delete []B;
    return 1;
}
Добавлено через 4 часа 47 минут
здесь мне нужно создать именной канал для связи между программами
создать и прочитать его не получается:
программа просто виснет, до "введите"

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
#include <stdio.h>
 
#include <iostream>
 
#include <sys/wait.h>
 
#include <unistd.h>
 
#include <fcntl.h>
 
 
 
using namespace std;
 
int main () 
 
{
    int x[10][10], i, j, k, n, st, check, fd[2];
    if (fork()==0)
    {
    unlink("offypipe") ;
    return 1; 
    }
    wait(NULL) ;
    
    if (mkfifo("offypipe",S_IFIFO|0666)<0) 
    { fprintf(stdout,"\noshibka sozdaniya kanala") ;
    return 0 ;}
    fd[1] = open("offypipe",O_WRONLY) ;
    fd[0] = open("offypipe",O_RDONLY|O_NONBLOCK) ;
    if (fork()==0)
    {
    cout<<"Vvedite razmernost' kvadrata chisel: ";
 
    cin>>n;
    write(fd[1],&n,n) ;
    return 1 ;
    }
    wait(NULL) ;
 
    cout << "\nVvedite elementy kvadrata:\n";
 
    for (i = 1; i <= n; i++) {
 
        cout << "...dlya " << i << "-oy stroki:\n";
 
        for (j = 1; j <= n; j++) {
 
            cin >> x[i][j];
 
        }
 
    }
 
    cout << "\nVvedyonnyy kvadrat:\n";
 
    for (i = 1; i <= n; i++) {
 
        for (j = 1; j <= n; j++) {
 
            cout << "\t" << x[i][j];
 
        }
 
        cout << "\n";
 
    }
 
    check = 0;
 
    for (i = 1; i <= n; i++) {
 
        for (j = 1; j <= n - 1; j++) {
 
            for (k = j + 1; k <= n; k++) {
 
                if (x[i][j] == x[i][k]) {
 
                    check++;
 
                }
 
            }
 
        }
 
    }
 
    for (j = 1; j <= n; j++) {
 
        for (i = 1; i <= n - 1; i++) {
 
            for (k = i + 1; k <= n; k++) {
 
                if (x[i][j] == x[k][j]) {
 
                    check++;
 
                }
 
            }
 
        }
 
    }
 
    if (check == 0) {
 
        cout << "\nVvedyonnyy kvadrat yavlyaetsya magicheskim.\n";
 
    } else {
 
        cout << "\nVvedyonnyy kvadrat ne yavlyaetsya magicheskim.\n";
 
    }
 
    int lol =read(fd[0],&n,15);
    cout << lol <<"\n"; 
 
    getchar();
 
    close(fd[0]) ; 
    close(fd[1]) ;
 
    return 0;
 
}
Добавлено через 11 минут
выдает ошибку создания пипы, если убираю причину зависания unlink("offypipe");
не знаю, что я делаю не по методичке
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2011, 17:16
Ответы с готовыми решениями:

Именованные каналы
Родитель передает три строки, потомок возвращает их, отсортировав в лексикографическом порядке. Реализовать через такое средство...

Linux pipes(каналы)
#include &lt;string.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; #define MAX_STRING_LENGTH 255 #define MAX_TOKS...

Неименованые программные каналы
Добрый день, есть такая вот задачка Процесс 1 порождает потомка 2, который в свою очередь порождает потомка 3. С помощью неименованных...

4
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.01.2011, 17:37
не понял... для чего в первом коде fork() ?
и у вас получилась жуткая смесь Си и С++
0
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
19.01.2011, 18:29  [ТС]
и у вас получилась жуткая смесь Си и С++
это не так важно, ведь без ввода каналов все работало
не понял... для чего в первом коде fork() ?
Для анлинка? Я не знаю отчего у меня не работает, и врубил дочерний процесс - так как думаю, что прога вообще завершается.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.01.2011, 19:19
Цитата Сообщение от OffyGhost Посмотреть сообщение
это не так важно
это важно, т.к. приведенный вами код приходится читать. а это страшно

в общем, загляните в man, и посмотрите описание.

Добавлено через 2 минуты
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
       #include <sys/wait.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <string.h>
 
       int
       main(int argc, char *argv[])
       {
           int pipefd[2];
           pid_t cpid;
           char buf;
 
           if (argc != 2) {
            fprintf(stderr, "Usage: %s <string>\n", argv[0]);
            exit(EXIT_FAILURE);
           }
 
           if (pipe(pipefd) == -1) {
               perror("pipe");
               exit(EXIT_FAILURE);
           }
 
           cpid = fork();
           if (cpid == -1) {
               perror("fork");
               exit(EXIT_FAILURE);
           }
 
           if (cpid == 0) {    /* Child reads from pipe */
               close(pipefd[1]);          /* Close unused write end */
 
               while (read(pipefd[0], &buf, 1) > 0)
                   write(STDOUT_FILENO, &buf, 1);
 
               write(STDOUT_FILENO, "\n", 1);
               close(pipefd[0]);
               _exit(EXIT_SUCCESS);
 
           } else {            /* Parent writes argv[1] to pipe */
               close(pipefd[0]);          /* Close unused read end */
               write(pipefd[1], argv[1], strlen(argv[1]));
               close(pipefd[1]);          /* Reader will see EOF */
               wait(NULL);                /* Wait for child */
               exit(EXIT_SUCCESS);
           }
       }
2
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
20.01.2011, 09:34  [ТС]
Вот это должно работать. Сначало запускается приложение В, потом А.

А) Определить является ли матрица А магическим квадратом. Входные данные: целое положительное число n, массив чисел А размерности nxn. Матрица является магическим квадратом, когда равны между собой суммы всех строк и суммы всех столбцов. Использовать n или n+1 процессов для решения задачи.
В) Заменить наиболее часто встречающийся символ в строке S1, наиболее часто встречающимся символом в строке S2 и наоборот. Входные данные второго приложения: строка символов A произвольной длины. Входные данные первого приложения: строка символов S1, S1 n*n длины.
Приложение В – читатель.

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
#include<iostream>
#include<map>
#include<algorithm>
#include <fcntl.h>
using namespace std;
 
int fd,n;
bool comp(pair<char, int> p, pair<char, int> p1){
    return p.second<p1.second;
}
 
char f(string& s){
    map<char, int>ma;
    for(int i=0;i<s.size();++i){
        if(s[i]!=' ') ma[s[i]]++;
    }
    map<char, int>::iterator it=max_element(ma.begin(), ma.end(), comp);
    return it->first;
}
 
int main(){
    fd = open("mypipe",O_RDONLY) ; 
    read(fd,&n,n);
    cout << n;
    n = n*n;
    string s1, s2;
    cout<<"\ninput s1\n";
    cin.getline(s1, n);
    cout<<"\ninput s2\n";
    cin.getline(s2, n);
    char f1=f(s1);
    char f2=f(s2);
    for(int i=0;i<s1.size();++i){
        if(s1[i]==f1)s1[i]=f2;
    }
    cout<<"\nFinal'naya stroka\n"<<s1 << "\n";
 
    close(fd);
    unlink("mypipe") ; 
}
Приложение В – писатель.
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
#include <stdio.h>
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
 
using namespace std;
int main () 
{
    int x[10][10], i, j, k, n, check;
    int fd;
    fd = open("mypipe",O_WRONLY) ;
    cout<<"Vvedite razmernost' kvadrata chisel: ";
    cin>>n;
        
    cout << "\nVvedite elementy kvadrata:\n";
    for (i = 1; i <= n; i++) {
        cout << "...dlya " << i << "-oy stroki:\n";
        for (j = 1; j <= n; j++) {
            cin >> x[i][j];
        }
    }
    cout << "\nVvedyonnyy kvadrat:\n";
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n; j++) {
            cout << "\t" << x[i][j];
        }
        cout << "\n";
    }
    check = 0;
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n - 1; j++) {
            for (k = j + 1; k <= n; k++) {
                if (x[i][j] == x[i][k]) {
                    check++;
                }
            }
        }
    }
    for (j = 1; j <= n; j++) {
        for (i = 1; i <= n - 1; i++) {
            for (k = i + 1; k <= n; k++) {
                if (x[i][j] == x[k][j]) {
                    check++;
                }
            }
        }
    }
    if (check == 0) {
        cout << "\nVvedyonnyy kvadrat yavlyaetsya magicheskim.\n";
    } else {
        cout << "\nVvedyonnyy kvadrat ne yavlyaetsya magicheskim.\n";
    }
    write(fd,&n,n) ;
    close(fd);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2011, 09:34
Помогаю со студенческими работами здесь

Неименованные каналы POSIX
Всем привет, делаю лабу по операционным системам. Не понимаю один момент. Задание: Родительский процесс создаёт два дочерних...

Каналы (PIPE) на Си. Небольшая недоработка с программой
Задание реализовать интерпретатор basha, шелла или любого подобного языка и чтобы работали конвееры! Тут пока что не совсем это, можно...

Каналы (pipe). Готовый код, нужно только ошибку в логике исправить.
Заранее спасибо всем, кто хотя бы зашел в эту тему) Весь код который ниже специально полностью прокомментировал, он маленький и...

Общение "родных" процессов через неименованый каналы связи
Стояла задача породить потомка fork который в своём теле вызовит exec* и выполнив программу её результат вернёт процессу родителю. Другими...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru