Я пытаюсь сделать программу, которая делает 9 дочерних процессов, поэтому я использую fork 9 раз, только если мы отец, вот так:
for (int i = 0; i < 9; i++) { // Creo 9 hijos.
if (child_pid > 0) {
child_pid = fork();
childs[i] = child_pid;
}
if (child_pid < 0)
printf("Error...\n");
}
Теперь, я должен печатать на каждом ребенке, какими детьми он является, начиная с 0, поэтому я думал об этом:
printf("This is child #%d\n", getpid() - getppid());
Но я не уверен, всегда ли это работает? Что делать, если родитель создает детей, операционная система создает другой процесс?, Количество детей будет прекращено?. И, наконец, если да, то как я могу сделать, что дети #n знают, что он является номером детей n?.
Вы можете использовать переменную i
чтобы указать, к какому ребенку вы находитесь, но логика вашего цикла неверна. Это должно выглядеть так:
for (int i = 0; i < 9; ++i) {
child_pid = fork();
if (child_pid == 0) {
// We are the child. The value of the i variable will tell us which one.
// If i == 0 we are the first child, i == 1 and we are the second, and so on.
printf("We are child #%d\n", i);
exit(EXIT_SUCCESS);
}
if (child_pid < 0) {
// Forking failed.
perror("fork()");
exit(EXIT_FAILURE);
}
// Otherwise we are the parent and forking was successful; continue the loop.
}
Операционная система не обязана назначать идентификаторы процессов в последовательном порядке. Если другой процесс использует следующий, он будет пропущен в последовательном методе присваивания, но ОС действительно может назначить случайное число в качестве pid, если оно не используется.
child_pid
? И почему каждый ребенок выполняет остальную часть цикла? Почему бы вам не сохранитьi
для каждого ребенка, когда вы определили его как ребенка, если вы заинтересованы в этом?