我有一个名为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()
{
...
}