如何在C中修复全局结构中的总线错误

时间:2019-05-18 23:42:14

标签: c struct

我有一个名为Scheduler的struct全局变量。我说是全局的,但是在为其分配完整的精简结构时,它会向我返回错误总线。根据我的研究,全局变量被认为是不可变的,而在给它赋值时我不能。下面的代码在scheduler.c模块中。 对不起英语

//Declaration
Escalonador *escalonador;

//------------------------------------------------------
//main
int main()
{
  pthread_t thread_interpretador;
  pthread_t thread_escalonador;
  init_escalonador();
...
}
//------------------------------------------------------
// Inicialize scheduler
static Scheduler *create_scheduler()
{
  Scheduler *new_scheduler = (Scheduler *)malloc(sizeof(Scheduler));

  if (new_scheduler == NULL)
  {
    printf("Dynamic memory allocation error. \n");
    exit(-1);
  }

  clean_scheduler(new_scheduler);
  new_scheduler->report = fopen(OUTPUT_FILE, "w");
  if (new_scheduler->report == NULL)
  {
    printf("Error to open file %s.\n", OUTPUT_FILE);
    exit(-1);
  }

  /* -- Remover este bloco de código em sistemas que não sejam MAC OS-- */

  sem_unlink("/scheduler_semaphore");
  new_scheduler->semaphore = sem_open("/scheduler_semaphore", O_CREAT | O_EXCL, 0644, 0);
  if (new_scheduler->semaphore == SEM_FAILED)
  {
    printf("Error to open semaphore.\n");
    exit(-1);
  }

  /* ------------------------------------------------------------------ */

  // Para funcionar nas distribuições linux:
  /*sem_init(new_scheduler->semaphore, 0, 0);*/

  return new_scheduler;
}

//-------------------------------------------------------
//assigning

void init_scheduler()
{
  scheduler = create_scheduler();

  register_report();
  fprintf(scheduler->report, "Escalonador iniciado..\n");

  signal(SIGUSR1, interpreter_finished);
  signal(SIGCHLD, process_finished);
  signal(SIGALRM, alarm_handler);
}

//----------------------------------------------------------
//Scheduler struct

typedef struct escalonador
{
  // Filas de processos prontos para cada prioridade. Fila = Queue
  Fila *processos_prontos[3];
  // Fila de processos em execucao
  Fila *processos_prontos_executando[3];
  // Fila de processos em I/O.
  Fila *processos_esperando;
  // Processo sendo executado. Process = Process
  Processo *processo_executando; 
  // Semáforo usado para sicronizar a admissão e
  // execução de processos no escalonador.
  sem_t *semaforo;
  // Contador de processos admitidos no escalonador.
  int cont_init_processos;
  // Contador de processos terminados no escalonador.
  int cont_processos_finalizados;
  // Contador decrescente de excucoes completas de cada fila de prioridade.
  int *cont_deces_fila_execucoes[3];
} Escalonador;

Error: line 2:  7987 Bus error: 10           ./main.out

//---------------------------------
//scheduler.c
#include <stdio.h>
...

#include "queue.h"
...

#define TRUE 1
#define FALSE 0
#define QUANTUM 1
#define NUM_ESC 1


typedef enum estado
{
...
} Estado;

typedef struct processo
{
...
} Processo;

typedef struct escalonador
{
  // Filas de processos prontos para cada prioridade. Fila = Queue
  Fila *processos_prontos[3];
  // Fila de processos em execucao
  Fila *processos_prontos_executando[3];
  // Fila de processos em I/O.
  Fila *processos_esperando;
  // Processo sendo executado. Process = Process
  Processo *processo_executando; 
  // Semáforo usado para sicronizar a admissão e
  // execução de processos no escalonador.
  sem_t *semaforo;
  // Contador de processos admitidos no escalonador.
  int cont_init_processos;
  // Contador de processos terminados no escalonador.
  int cont_processos_finalizados;
  // Contador decrescente de excucoes completas de cada fila de prioridade.
  int *cont_deces_fila_execucoes[3];
} Escalonador;

// Global variable
Escalonador *escalonador;

// Declaração variáveis estáticas
static Escalonador *cria_escalonador();
static void ...

/**
 * Inicializa o escalonador (estrutura e tratamento de sinais)
 */
void init_escalonador()
{
...
}

0 个答案:

没有答案