Мне нужно написать программу, которая создает процесс с помощью pipe ()
.
Моя первая задача - написать родительский процесс, который генерирует четыре дочерних процесса. с помощью функции fork ()
.
Как только fork ()
завершится успешно, замените дочерний процесс другим процессом rover1, rover2, rover3 и rover4
, хотя все они имеют одинаковый код.
] Функция процессов заключается в следующем.
Каждому дочернему процессу изначально присваивается собственный номер. Он получает новый номер от родителя. Используя следующую формулу, он создает свой собственный новый номер следующим образом и перенаправляет его родительскому элементу:
mynumber = (3 * mynumber + 4 * numberreceived) / 7
Этот процесс продолжается до тех пор, пока родительский элемент не отправит сообщение о том, что система стабильно. Родитель также имеет свой начальный номер. Он получает номера всех дочерних элементов и вычисляет свое новое число следующим образом:
mynumber = (3 * mynumber + числа, отправленные всеми дочерними элементами ) / 7
Родитель отправит это число в все его дети. Этот процесс будет продолжаться до тех пор, пока родитель не обнаружит, что его номер больше не меняется. В это время он сообщит детям, что система стала стабильной.
Это то, что я сделал, но мой профессор сказал, что я должен использовать exec () для выполнения дочернего процесса и замены дочернего процесса другим дочерним процессом. Я не уверен, как использовать exec (). Не могли бы вы помочь мне с этим.
Я прикрепляю только первое дочернее поколение.
// I included stdio.h, unistd.h stdlib.h and errno.h
int main(void)
{
// Values returned from the four fork() calls
pid_t rover1, rover2, rover3, rover4;
int parentnumber, mynumber1, mynumber2, mynumber3, mynumber4;
int childownnumber1 = 0, status = 1, childownnumber2 = 0,
childownnumber3 = 0, childownnumber4 = 0, numberreceived = 0;
printf("Enter parent number: ");
printf("%d", parentnumber);
printf("Enter each children number");
printf("%d %d %d %d", mynumber1, mynumber2, mynumber3, mynumber4);
// Create pipes for communication between child and parent
int p1[2], p2[2];
// Attempt to open pipe
if (pipe(p1) == -1) {
perror("pipe call error");
exit(1);
}
// Attempt to open pipe
if (pipe(p2) == -1) {
perror("pipe call error");
exit(1);
}
// Parent process generates 4 child processes
rover1 = fork();
// if fork() returns 0, we're in the child process;
// call exec() for each child to replace itself with another process
if (rover1 == 0) {
for(; numberreceived != 1; ) {
close(p1[1]); // Close write end of pipe
close(p2[0]); // Close read end of second pipe
// Read parent's number from pipe
read(p1[0], &numberreceived, sizeof(int));
if (numberreceived == 1) {
// System stable, end child process
close(p1[0]);
close(p2[1]);
_exit(0); // End child process
}
mynumber1 = (int)((3*mynumber1 + 4*numberreceived)/7.0);
printf("\nrover1 number: ");
printf("%i", mynumber1);
// Write to pipe
write(p2[1], &mynumber1, sizeof(int));
}
}
/* Error:
* If fork() returns a negative number, an error happened;
* output error message
*/
if (rover1 < 0) {
fprintf(stderr,
"can't fork, child process 1 not created, error %d\n",
errno);
exit(EXIT_FAILURE);
}
}