Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2016, 22:00   #1
ro7028
Новичок
Джуниор
 
Регистрация: 22.12.2016
Сообщений: 1
Сообщение Неименованные каналы POSIX.

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

Задание:
Родительский процесс создаёт два дочерних процесса. Далее он генерирует последовательность из 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;
}
ro7028 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неименованные пространства имен RAFA91 Общие вопросы C/C++ 40 17.05.2015 12:20
WinApi и Posix ZoxWatt Фриланс 0 06.02.2013 22:43
Интерпретация командной троки.Файловые операции в POSIX. Mustdieken Помощь студентам 0 23.05.2011 22:01
Posix Threads Ghevond20 Общие вопросы C/C++ 0 12.12.2009 01:31