我的fork()ing runsim.c程序运行得太慢

时间:2018-05-06 01:03:55

标签: c command-line parallel-processing fork

我有一个不想正常工作的课程作业。我应该通过从命令行接受一个带有数据文件链接的参数来执行:“。/ runsim 3< testing.data” 该程序应该从该文件读取行,fork()输出子进程,并使用数据文档中的行来执行另一个名为testsim的程序。 Testsim和数据文件由我们的老师提供,我所谈过的所有学生都说他们跑得很快。我引用了他们的项目,我的代码非常相似,但myine仍然运行缓慢。我通过SSH处理它,所以我不认为这是我的硬件。关于减缓这种情况的任何想法都将深受赞赏。

#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;
}

0 个答案:

没有答案