Мне нужно создать три дочерних процесса, каждый из которых считывает строку из аргументов командной строки и записывает строку в один канал. Затем родитель будет читать строки из канала и отображать все три из них на экране. Я попытался сделать это для двух процессов, чтобы проверить, и он печатает одну из строк дважды, а не обе.Создание нескольких дочерних процессов с помощью одного канала
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
char *character1 = argv[1];
char *character2 = argv[2];
char inbuf[100]; //creating an array with a max size of 100
int p[2]; // Pipe descriptor array
pid_t pid1; // defining pid1 of type pid_t
pid_t pid2; // defining pid2 of type pid_t
if (pipe(p) == -1) {
fprintf(stderr, "Pipe Failed"); // pipe fail
}
pid1 = fork(); // fork
if (pid1 < 0) {
fprintf(stderr, "Fork Failed"); // fork fail
}
else if (pid1 == 0){ // if child process 1
close(p[0]); // close the read end
write(p[1], character1, sizeof(&inbuf[0])); // write character 1 to the pipe
}
else { // if parent, create a second child process, child process 2
pid2 = fork();
if (pid2 < 0) {
fprintf(stderr, "Fork Failed"); // fork fail
}
if (pid2 = 0) { // if child process 2
close(p[0]); // close the read end
write(p[1], character2, sizeof(&inbuf[0])); // write character 2 to the pipe
}
else { // if parent process
close(p[1]); // close the write end
read(p[0], inbuf, sizeof(&inbuf[0])); // Read the pipe that both children write to
printf("%s\n", inbuf); // print
read(p[0], inbuf, sizeof(&inbuf[0])); // Read the pipe that both children write to
printf("%s\n", inbuf); // print
}
}
}
я забыл упомянуть. Я попытался дважды использовать инструкцию read и дважды печатать. Он печатает первую строку два раза, а не обе строки. – Matador89
Отредактировано это, чтобы включить это. – Matador89
Поскольку вы не обращаете внимания на возвращаемое значение из 'read()', никто не может догадаться, что вы возвращаете. Даже если вы игнорируете ошибки записи, вы должны обратить внимание на то, что возвращает 'read()'; вы не знаете, сколько данных действительно, если вы не посмотрите на количество возвращенных байтов. –