Системное программирование: Fork () - PullRequest
0 голосов
/ 03 мая 2018

Я предоставил код для проблемы, которая связана с форком. Однако я нахожусь в трудном положении, выясняя несколько ключевых частей программы. Проблема заявляет для меня Проверить соответствующий аргумент командной строки и вывести сообщение об использовании, если командная строка это неверно. Инициализируйте 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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...