Я предоставил код для проблемы, которая связана с форком. Однако я нахожусь в трудном положении, выясняя несколько ключевых частей программы. Проблема заявляет для меня Проверить соответствующий аргумент командной строки и вывести сообщение об использовании, если командная строка
это неверно. Инициализируйте pr_limit из командной строки. Переменная pr_limit указывает максимальное количество дочерних элементов, которые могут быть выполнены за один раз. Переменная pr_count содержит количество активных дочерних элементов. Инициализируйте его равным 0. Выполните следующий основной цикл, пока на стандартном вводе не будет достигнут конец файла: Если pr_count равен pr_limit, дождитесь окончания дочернего процесса и уменьшите значение pr_count. Считайте строку из стандартного ввода (fgets) длиной до MAX_BUF символов и выполните программу, соответствующую этой командной строке, разветвив дочерний элемент и выполнив файл. Увеличьте pr_count, чтобы отслеживать количество активных детей. Проверьте, закончил ли кто-либо из детей (**). Уменьшите pr_count для каждого завершившегося потомка. После обнаружения конца файла при стандартном вводе дождитесь завершения всех оставшихся потомков
и затем выход. Для каждого завершенного дочернего элемента выводится его код выхода.
Часть, которую я испытываю с трудностями при реализации, включает чтение строки из стандартного файла и выполнение программы, соответствующей командной строке, путем разветвления. А также отслеживание активных детей и проверка, закончили ли дети. Все еще довольно плохо знаком с системным программированием.
int main (int argc, char *argv[])
{
FILE *file;
file = fopen("testsim.c", "r+");
pid_t childpid;
childpid = fork();
int len = 0;
char *line = NULL;
read = getline(&line, &len, file);
MAX_BUF = read;
char buf[MAX_BUF];
int i, pr_limit;
int pr_count = 0;
if (argc != 2)
{
fprintf(stderr, "Usage: %s processes\n", argv[0]);
return 1;
}
if (childpid == 0)
{
while (!feof(file))
{
if (pr_count == pr_limit)
{
wait(-1, &status, WNOHANG);
pr_count--;
}
else
{
fgets(buf, MAX_BUF, file);
}
pr_limit = atoi(argv[1]);
for (i = 0; i < pr_limit; i++)
{
if ((childpid = fork()) <= 0)
break;
}
fprintf(stderr, "i: %d process ID: %ld parent ID: %ld child ID: %ld\n", i, getpid(), getppid(), childpid);
}
}
if (pid < 0)
{
perror("Error: \n");
return EXIT_FAILURE;
}
return 0;
}