Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С под Linux

Войти
Регистрация
Восстановить пароль
 
maximq
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 29
#1

Неименованные каналы POSIX - C Linux

22.12.2016, 21:37. Просмотров 444. Ответов 2
Метки нет (Все метки)

Всем привет, делаю лабу по операционным системам. Не понимаю один момент.

Задание:
Родительский процесс создаёт два дочерних процесса. Далее он генерирует последовательность из n случайных целых чисел, выводит их на печать и передаёт обоим дочерним процессам. Первый дочерний процесс возвращает родительскому те из чисел, которые в своём десятичном представлении содержат цифру 3, а второй — цифру 5. Родительский процесс должен вывести полученные числа вместе с номерами дочерних процессов, от которых он эти числа получил.

Собственно проблема такая : Первому дочернему последовательность передаётся нормально, а вот второму нет, почему то зацикливается и там вообще левые числа.

Неполный код:

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
/*
 *
 *
 * Родительский процесс создаёт два дочерних процесса. 
 * Далее он генерирует последовательность из n случайных целых чисел, 
 * выводит их на печать и передаёт обоим дочерним процессам. 
 * Первый дочерний процесс возвращает родительскому те из чисел,
 * которые в своём десятичном представлении содержат цифру 3, а второй — цифру 5.
 * Родительский процесс должен вывести полученные числа вместе с номерами 
 * дочерних процессов, от которых он эти числа получил.
 *
 *
 */
 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
 
#include <unistd.h>
#include <sys/types.h>
 
#define N 10
#define ROUND 300
 
int main() {
    int cp_ds[2];
    int sec_cp_ds[2];
    pid_t cpid;
    pid_t sec_cpid;
    
    if (pipe(cp_ds) == -1){
        perror("Can't open pipe.");
        exit(EXIT_FAILURE);
    }
 
    cpid = fork();
    if (cpid == -1) {
        perror("Can't fork first children pipe.");
        exit(EXIT_FAILURE);
    }
 
    if (cpid > 0) {
        if (pipe(sec_cp_ds) == -1) {
            perror("Can't open pipe.");
            exit(EXIT_FAILURE);
        }
 
        sec_cpid = fork();
        if (sec_cpid == -1) {
            perror("Can't fork second children pipe.");
            exit(EXIT_FAILURE);
        }
 
        if (sec_cpid > 0) {
            // код родительского
            srand( time(NULL) );
            int * seq = (int *) calloc (N, sizeof(int));
            for ( size_t i = 0; i < N; ++ i ){
                seq[i] = rand() % ROUND;        
            }
 
            for ( size_t i = 0; i < N; ++ i) {
                printf("seq[ %lu ] = %3d\n" , i, seq[i]);
            }
 
            // передать обоим детям
            
            close(cp_ds[0]);
            write(cp_ds[1], (void *) seq, N * sizeof(int));
            close(cp_ds[1]);
 
            close(sec_cp_ds[0]);
            write(sec_cp_ds[1], (void *) seq, N * sizeof(int));
            close(sec_cp_ds[1]);
 
        } else {
            // код второго чилдрена
            int buf[N * sizeof(int)];
            int len;
            close(sec_cp_ds[1]);
            printf("Here2\n");
            
            while ((len = read(sec_cp_ds[0], buf, sizeof(int))) != 0){
                //printf("%d\n", *buf );
            }
        
            close(sec_cp_ds[0]);
        }
    } else {
        // а тут код чилдрена
        int buf[N * sizeof(int)];
        int len;
        close(cp_ds[1]);
        printf("Here1\n");
        while ((len = read(cp_ds[0], buf, sizeof(int))) != 0){
            printf("%d\n", *buf );
        }
    
        close(cp_ds[0]);
    }   
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2016, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неименованные каналы POSIX (C Linux):

Posix поток - C Linux
Вообщем сделал такую программу, используя поток, которая просто выводит сообщения, скомпилировал как надо: gcc Programm.c -lpthread . ...

Обход каталога в POSIX - C Linux
не работает код, в чем ошибка может быть, помогите разобраться, в с под линукс только начинаю учиться. #include &lt;stdio.h&gt; #include...

Потоки Posix. C Linux - C Linux
Пишу программу. При компиляции ошибок нет. Когда пытаюсь выполнить выдает ошибку : &quot;Ошибка сегментирования&quot;. В чем может быть проблема?...

Очередь сообщений posix - C Linux
как известно для создания новой очереди сообщений существует вызов mq_open(qmd_t *qds,o_flag,file_mode,struct mq_attr *attr) при этом...

Генератор сигнала на C под POSIX - C Linux
Добрый день уважаемые форумчане! Нужна ваша помощь... Сначала небольшая предыстория: С++ у нас вели из рук вон... (я не пропускал - а то...

Точный delay() , желательно только POSIX - C Linux
Сразу говорю: &quot;Я знаю о вытесняющей многозадачности и то, что freebsd/linux не realtime OS!&quot; Нужны мелкие задержки, начиная от 10...

2
drfaust
261 / 152 / 37
Регистрация: 02.10.2008
Сообщений: 569
Записей в блоге: 1
Завершенные тесты: 1
23.12.2016, 13:59 #2
Может проблема в том, что pipe закрывается папашей сразу после записи. А вот кто из детей успеет добраться до pipe пока pipe не закрыт, тот и отрабатывает нормально
0
maximq
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 29
23.12.2016, 17:16  [ТС] #3
71 строка? без этого вроде вообще мусор будет передаваться

Добавлено через 2 часа 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
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*
 *
 *
 * Родительский процесс создаёт два дочерних процесса. 
 * Далее он генерирует последовательность из n случайных целых чисел, 
 * выводит их на печать и передаёт обоим дочерним процессам. 
 * Первый дочерний процесс возвращает родительскому те из чисел,
 * которые в своём десятичном представлении содержат цифру 3, а второй — цифру 5.
 * Родительский процесс должен вывести полученные числа вместе с номерами 
 * дочерних процессов, от которых он эти числа получил.
 *
 *
 */
 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/wait.h>
 
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
 
#define ROUND 3000
 
bool includes_digit(int number, int digit){
    while (number != 0){
        int cur_dig = number % 10;
        if (digit == cur_dig){
            return true;
        }
 
        number = (number / 10);
    }
}
 
int main(int argc, char * argv[]) {
    int cp_ds[2];
    int sec_cp_ds[2];
    int back_p[2];
    int sec_back_p[2];
    pid_t cpid;
    pid_t sec_cpid;
    
    if (argv[1] == NULL){
        perror("Enter the N please.");
        exit(EXIT_FAILURE);
    }
 
    int N = atoi(argv[1]);
 
    if (pipe(cp_ds) == -1){
        perror("Can't open pipe.");
        exit(EXIT_FAILURE);
    }
 
    if (pipe(back_p) == -1){
        perror("Can't open pipe.");
        exit(EXIT_FAILURE);
    }
 
    if (pipe(sec_back_p) == -1){
        perror("Can't open pipe.");
        exit(EXIT_FAILURE);
    }
    
    cpid = fork();
    if (cpid == -1) {
        perror("Can't fork first child pipe.");
        exit(EXIT_FAILURE);
    }
 
    if (cpid > 0) {
        if (pipe(sec_cp_ds) == -1) {
            perror("Can't open pipe.");
            exit(EXIT_FAILURE);
        }
 
        sec_cpid = fork();
        if (sec_cpid == -1) {
            perror("Can't fork second child pipe.");
            exit(EXIT_FAILURE);
        }
 
        if (sec_cpid > 0) {
            // Parent
            // Generate random sequence
            srand( time(NULL) );
            int * seq = (int *) calloc (N, sizeof(int));
            for ( size_t i = 0; i < N; ++ i ){
                seq[i] = rand() % ROUND;        
            }
 
            for ( size_t i = 0; i < N; ++ i) {
                printf("seq[%lu]  =  %4d\n" , i, seq[i]);
            }
            printf("\n");
 
            // Give both child
            close(cp_ds[0]);
            write(cp_ds[1], (void *) seq, N * sizeof(int));
            close(cp_ds[1]);
 
            close(sec_cp_ds[0]);
            write(sec_cp_ds[1], (void *) seq, N * sizeof(int));
            close(sec_cp_ds[1]);
 
            // Get back from childs
            int buf;
            ssize_t len;
 
            // From first child
            close(back_p[1]);
            len = read(back_p[0], &buf, sizeof(int));
            int size = buf;
            for (int i = 0; i < size; ++ i){
                len = read(back_p[0], &buf, sizeof(int));
                int cur = buf;
                printf("Get from first child = %d\n", cur);
            }
            printf("\n");
            close(back_p[0]);
 
 
 
            // From second child
            len = read(sec_back_p[0], &buf, sizeof(int));
            int size2 = buf;
            for (int i = 0; i < size2; ++ i){
                len = read(sec_back_p[0], &buf, sizeof(int));
                int cur = buf;
                printf("Get from second child = %d\n", cur);
            }
            close(back_p[0]);
 
 
        } else {
            // Second child
            int buf[N * sizeof(int)];
            ssize_t num;
            int * seq = (int *) calloc (N, sizeof(int));
            int ind = 0;
 
            // Read from parent
            close(sec_cp_ds[1]);
            num = read(sec_cp_ds[0], buf, N * sizeof(int));
            for (int i = 0; i < N; ++ i){
                if (includes_digit(buf[i], 5)){
                    seq[ind] = buf[i];
                    ind++;
                }
            }
            close(sec_cp_ds[0]);            
            
            // Write to parent  
            close(sec_back_p[0]);
            write(sec_back_p[1], &ind, sizeof(int));
            for (int i = 0; i < ind; ++ i){
                write(sec_back_p[1], &seq[i], sizeof(int));
            }
            close(sec_back_p[1]);       
        }       
    } else {
        // Child
        int buf[N * sizeof(int)];
        ssize_t num;
 
        int * seq = (int *) calloc (N, sizeof(int));
        int ind = 0;
        
        // Read from parent
        close(cp_ds[1]);
        num = read(cp_ds[0], buf, N * sizeof(int));
        for (int i = 0; i < N; ++ i){
            if (includes_digit(buf[i], 3)){
                seq[ind] = buf[i];
                ind++;
            }
        }
        close(cp_ds[0]);
        
        // Write to parent
        close(back_p[0]);
        write(back_p[1], &ind, sizeof(int));
        for (int i = 0; i < ind; ++ i){
            write(back_p[1], &seq[i], sizeof(int));
        }
        close(back_p[1]);
    
    }
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2016, 17:16
Привет! Вот еще темы с ответами:

Изменить размер у POSIX shared memory сегмента - C Linux
Подскажите, пожалуйста, как изменить размер уже выделенного сегмента разделяемой памяти? Вот так выделяю: // Размер...

Интерпретация командной строки. Файловые операции POSIX. Прошу помочь дописать программу - C Linux
Стоит такое задание: Написать программу, которая обеспечивает работу команды вида : , где - a и - b несовместимые флаги - если...

Полудуплексные каналы - C Linux
Сама программа с матрицами не сильно важна, а важен сам механизм передачи через каналы между программами, что не могу реализовать. А)...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru