Я хочу сделать процессы NO_PROC
, чтобы каждый процесс читал сообщения от своего родителя, а затем записывал эти сообщения и еще одно сообщение своему дочернему элементу, за исключением случая последнего процесса, который пишет его сообщений до stdout
. Таким образом, процесс i'th получит i-1 сообщения и отправит ребенку i сообщений. Я должен использовать канал для связи между процессами. Я написал код, но что-то не так, и я не могу найти ошибку: /. Когда NO_PROC = 5
Я хочу, чтобы результат выглядел как 4 строки с «моим сообщением», но на выходе у меня есть одна строка: «мое сообщение» и 3 пустые строки, например 3 сообщения - пустая строка: /. Примечание. err.h
- это моя библиотека, которая дает мне функцию syserr()
, когда что-то пошло не так.Отправка сообщений с использованием pipe - C
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "err.h"
#define NO_PROC 5
#define BUF_SIZE 20
char message[] = "my message";
int parent;
char buf[BUF_SIZE];
int main()
{
for (int i = 0; i < NO_PROC; ++i) {
int pipe_dsc[2], buf_len;
if (pipe(pipe_dsc) == -1)
syserr("Error in pipe\n");
pid_t pid = fork();
if (pid == -1)
syserr("Error in fork\n");
else if (pid == 0)
parent = pipe_dsc[0];
else {
for (int j = 0; j < i; ++j) {
if ((buf_len = read(parent, buf, BUF_SIZE - 1)) == -1)
syserr("Error in read\n");
buf[buf_len < BUF_SIZE - 1 ? buf_len : BUF_SIZE - 1] = '\0';
if (i == NO_PROC - 1)
printf("%s\n", buf);
else if (write(pipe_dsc[1], buf, sizeof(buf)) != sizeof(buf))
syserr("Error in write\n");
}
if (i < NO_PROC - 1 && write(pipe_dsc[1], message, sizeof(message)) != sizeof(message))
syserr("Error in write\n");
if (wait(0) == -1)
syserr("Error in wait\n");
return 0;
}
}
}
«что-то не в порядке». Пожалуйста, будьте более конкретными. Например, пожалуйста, сообщите нам точный ожидаемый результат и фактический результат. – kaylum
Извините, я полностью забыл об этом. Итак, когда NO_PROC = 5, я хочу, чтобы результат выглядел так: – Niko
Пожалуйста, добавьте информацию в вопрос. Не как комментарии. – kaylum