Моя программа fork () работает с runim.c слишком медленно - PullRequest
0 голосов
/ 06 мая 2018

У меня есть задание для класса, которое просто не хочет работать правильно. Я должен выполнить, приняв аргумент из командной строки со ссылкой на файл данных, например: «./runsim 3

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

#define MAX_BUF 1024

int main (int argc, char *argv[]){
    pid_t childpid=0;
    int pr_limit, pr_count=0, status;
    char s[MAX_BUF], program[MAX_BUF], num1[MAX_BUF], num2[MAX_BUF];

    if(argc!=2){ /* check for valid number of command-line arguments */
        fprintf(stderr, "Usage: %s (int) < filename\n", argv[0]);
        return 1;
    }

    pr_limit=atoi(argv[1]);

    while(fgets(s, 100, stdin)){
        /* checks pr_limit and waits for a child to finish if reached  */
        if(pr_count==pr_limit){
            waitpid(-1, &status, 0);
            pr_count--;
            printf("Child Exit Code: %d\n", WEXITSTATUS(status));
        }

        /* reads in strings for commands  */
        sscanf(s, "%s %s %s", program, num1, num2);
        /* this if loop creates forks from the parent */
        if((childpid=fork())<=0){
            /* this if loop catches fork failures */
            if(childpid<0){
                perror("Child Failed To Fork");
                return 1;
            }
            break;
        }

        pr_count++;

        /* executes commands from file in child  */
     /* if(childpid==0){
            printf("%s %s %s\n", program, num1, num2);
            execl(program, program, num1, num2, NULL);
        } */

        /* checks to see if any child has finished */
        if(waitpid(-1, NULL, WNOHANG)!=0){
            pr_count--;
        }
    }

    /* executes commands from file in child  */
    if(childpid==0){
        execl(program, program, num1, num2, NULL);
    }

    while(1){
        childpid=waitpid(-1, &status, 0);
        if(childpid==-1){
            break;
        }
        pr_count--;
        printf("Child Exit Code: %d\n", WEXITSTATUS(status));
    }
    return 0;
}
...