-2

だから私はスケジューラシミュレーションを行うためのいくつかのヒントについて疑問に思っています。

これまでのところ、コマンドラインでファイルを入力したいだけです。つまり、/。schedulerin.fileです。

in.fileには、次の情報が含まれています。

./Job1.txt
./Job2.txt
./Job3.txt
./Job4.txt

各Job.txtファイルには、ランダムなコード行があります。最初の行だけが重要です。最初の行は「ティック」時間の開始です。

ジョブA:

10
1fi
3sdkfj
4ksdkk
5kdkfk
6kdkjf
7dkjkfd
9dkkf
10dku

現時点では、in.fileを取得し、「ジョブ」ファイルを到着ティック時間の順に、つまり最初の行に並べたいと思います。

これまでの私のコード:

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


#include "projscheduler.h"



/* I/O Files */
//static char *inputFile;
char * in;
static FILE *input;

/*Scheduled jobs indexed by PID*/
struct job list[20];

/* the next job to schedule */
//static struct job *job_next = NULL;

/* Time */
time clock;

/*Initialises job list*/
static void initialise_list(void) {
    for(int i = 0; i < sizeof(list)/sizeof(list[0]); i++) {
        list[i].parameters.pid = -1;
    }
}

/** Read and parse input from input file */
static void parse_input(void) 
{
    char    buffer[BUFSIZ];
    //int   jobs;



    initialise_list();



    while( fgets(buffer, sizeof(buffer), input) )   
    {
        pid j_pid;
        sscanf(buffer, "./%d.txt", &j_pid);

    } 

}   


int main(int argc, char **argv) 
{

    if ( (input = fopen(in, "r")) == NULL ) {
        fprintf(stderr, "cannot open %s\n", argv[1]);
    }

    parse_input(); 


    return EXIT_SUCCESS;
}

ヘッダーファイル:

/**
 * Simulation of a process scheduler
*/

//#ifndef SCHEDULER_H_
#define SCHEDULER_H_

#include <stddef.h>


/* types */
/** units of time */
typedef long time;
/** process identifier */
typedef int pid;

/** Information about a job of interest to the task scheduler */
struct job_data {

/* pid of this process */
    pid pid;
    /* time process starts */
    time start;
    /* time needed to finish */
    time finish;
    /* time spent processing so far */
    time scheduled;
    /* size of the process */
    size_t size;

};

struct job {

    /* Various parameters used by the scheduler */
    char job_name[BUFSIZ];
    struct job_data parameters;
    /* next job to be scheduled */
    //struct job *next;


};
4

2 に答える 2

2

正確にどのような問題が発生しているかはわかりませんが、コードに次のエラーが表示されます。

  • このinitialise_list()関数では、forループが何度も繰り返され、配列の境界を超えています。

    for(int i = 0; i < sizeof(list); i++) {
    

assizeof(list)は、配列が占めるバイト数を返します20 * sizeof(struct job)。への変更:

    for(int i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
  • これは試行から欠落している左括弧ですfopen()(投稿されたコードがコンパイルされないことを意味します):

    if( (input = fopen(inputfile, "r") == NULL )
    

する必要があります:

    if( (input = fopen(inputfile, "r")) == NULL )
  • projは初期化char*されており、これによりセグメンテーション違反が発生する可能性があります。

    char *proj;
    sscanf(buffer, "./%s.txt", proj);
    
于 2012-10-08T12:47:35.623 に答える
1
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>


#include "projscheduler.h"



/* I/O Files */
//static char *inputFile;
char * in;
static FILE *input;
static FILE *cur;
/*Scheduled jobs indexed by PID*/
struct job list[20];

/* the next job to schedule */
//static struct job *job_next = NULL;

/* Time */
time clock;

/*Initialises job list*/
static void initialise_list(void) {
    for(int i = 0; i < sizeof(list)/sizeof(list[0]); i++) {
        list[i].parameters.pid = -1;
    }
}

/*Order Jobs*/
/*=static void order_jobs(void)
{
    for(int i=0; i < sizeof(list)/sizeof(list[0]); i++)
    {


}
*/

/** Read and parse input from input file */
static void parse_input(void) 
{
    char    buffer[BUFSIZ];
    char    lines[BUFSIZ];
    int jobs = 0;
    struct  job *current;


    initialise_list();



    while( fgets(buffer, sizeof(buffer), input) )   
    {


        time start;
        char  buf[20];
        sscanf(buffer,"./%s/", buf);
        cur = fopen(buf, "r" );





        fgets(lines, sizeof(lines), cur);
        sscanf(lines,"%ld", &start);


        current = &list[jobs];

        current->job_id = buf;
        current->parameters.start = start;

        jobs++;

    } 

    for (int i = 0; i < jobs; i++)
    {
        printf("%s starts at %ld\n", list[i].job_id, list[i].parameters.start);
    }   

}   


int main(int argc, char **argv) 
{
    in = argv[1];
    if ( (input = fopen(in, "r")) == NULL ) {
        fprintf(stderr, "cannot open %s\n", argv[1]);
    }

    parse_input();



    return EXIT_SUCCESS;
}

上記では、in.fileを正常に読み取り、テキストファイルを表す各アドレスから最初の行を抽出しました。

次のヘッダーに関連付けられている上記のコード:

/**
 * Simulation of a process scheduler
*/

//#ifndef SCHEDULER_H_
#define SCHEDULER_H_

#include <stddef.h>


/* types */
/** units of time */
typedef long time;
/** process identifier */
typedef int pid;

/** Information about a job of interest to the task scheduler */
struct job_data {

/* pid of this process */
    pid pid;
    /* time process starts */
    time start;
    /* time needed to finish */
    time finish;
    /* time spent processing so far */
    time scheduled;
    /* size of the process */
    size_t size;

};

struct job {

    /* Various parameters used by the scheduler */
    char * job_id;
    struct job_data parameters;
    /* next job to be scheduled */
    //struct job *next;


};
于 2012-10-08T15:12:03.607 に答える