Так что мне нужна эта программа, которая должна создать дочерний элемент argv [1] с использованием fork() и напечатать, какой номер у них есть и какой PID у них есть в порядке его создания.C пика и трубы для печати pid в порядке
Я должен сделать это, используя свойства блокировки труб.
Пример вывода:
Я ребенок 1 и мой ПИД 25853.
Я ребенок 2 и мой ПИД 25854.
Я ребенок 3 и мой ПИД 25855.
Это то, что я пробовал до сих пор, но не соблюдает порядок создания детей.
int main(int argc, char* argv[])
{
char buffer[80];
int p[2], i;
int pid = getpid();
for (i = 0; i < atoi(argv[1]); i++) {
pipe(p);
if (fork() == 0) {
read(p[0], &pid, sizeof(pid)); // It should block here until there's
// something in the pipe to read
sprintf(buffer, "I am child %d and my PID is %d\n", i + 1, getpid());
write(1, &buffer, strlen(buffer));
close(p[0]);
close(p[1]);
exit(0);
}
else { // parent
close(p[0]);
write(p[1], &pid, sizeof(pid));
close(p[1]); // The child is able to read the EOF now.
}
}
while ((waitpid(-1, NULL, 0)) > 0)
;
close(p[0]);
close(p[1]);
sprintf(buffer, "I've finished\n");
write(1, &buffer, strlen(buffer));
}
Я чувствую, что я близок, но я не правильно использую каналы каналов. Мне нужен совет, спасибо.
Ребенок работает * одновременно с родителем. В частности, ваш родитель не дожидается завершения до того, как будет обработан дочерний файл 'fork(), поэтому порядок, в котором дети печатают на консоль, не является детерминированным. Вы должны 'wait()' * внутри * '' for() '-loop в родительском. – EOF
Да, дело в том, что он должен быть одновременно, но вы должны печатать детей в порядке, используя свойства blockin. –
@EOF, поэтому я не могу использовать wait на каждом цикле, или он не будет одновременным. –