示例#1
0
/**
 * Executar Comandos
 * @arg l, ponteiro para a lista de comandos do sergento
 * @return, um inteiro representando os giros no sentido horário do soldado
 **/
int executarComandos(char *l) {
  // 'D', representa girar um passo no sentido horário
  if(*l == 'D') {
    return executarComandos((l + 1)) + 1;
  }
  // 'E', representa girar três passos no sentido horário
  else if(*l == 'E') {
    return executarComandos((l + 1)) + 3;
  }
  // '\0', não há giro
  else {
    return 0;
  }
}
示例#2
0
/**
 * Volver
 * @arg n, quantidade de comandos dito pelo sargento.
 * @arg l, vetor com os comandos dito pelo sargento.
 * @return a direção para o qual o recruta deve ter sua face voltada após executar a série de comandos. Nessa etapa deve conter os caracteres 'N', 'L', 'S' e 'S' para representar os quatro pontos cardeais.
 **/
char volver(int n, char *l) {
  char rosaDosVentos[4] = {'N', 'L', 'S', 'O'};

  // Executa os comando do sargento
  unsigned int direcaoDaFace = executarComandos(l) % 4;

  // Descobre a direção da face, a partir da Rosa dos Ventos
  return rosaDosVentos[direcaoDaFace];
}
示例#3
0
文件: main.c 项目: estevao2012/so_tp1
int main(int argc , char* argv[])
{
    char* fim = "fim"; 
    char** args;
    char argumentos[512];  
    int qntPipes,tmp_entrada,tmp_saida,bg=0; 
    char* prompt = "Quais são suas ordens ? ";
    pid_t processo,w;
    int fileOpen,status;

    fileOpen = open(argv[1],O_RDONLY);

    /* Open File For Standard Input */
    if( ( fileOpen ) == 0 ){
        printf( "Cannot Open File ") ;
        exit( 1 ) ;
    }

    if( fileOpen != 0 ){
        dup2( fileOpen, 0 ); /* Make fp stdin */
        close( fileOpen ) ; /* Close original fp */
    }

    //Valida o que for escrito pelo usuario
    printf("%s",prompt);

    while(fgets(argumentos,512,stdin) != NULL){

        strtok(argumentos,"\n");

        args = parseCommands(argumentos);

        localizaRedirecionamentos(args,&tmp_entrada,&tmp_saida,&bg);
        if(bg != 0){
            removeSimboloBackground(args,bg);
        }
        qntPipes = quantidadePipes(args); 

        processo = fork();
        if (processo == 0){
            if(bg != 0)printf("[1] %ld\n", (long) getpid());
            executarComandos(args,qntPipes);
            _exit(EXIT_SUCCESS);
        }else{
            if(bg != 0){
                do {
                    w = waitpid(processo, &status, WUNTRACED | WCONTINUED);
                    if (w == -1) {
                        perror("waitpid");
                        exit(EXIT_FAILURE);
                    }

                    if (WIFEXITED(status)) {
                        printf("Concluido status=%d\n", WEXITSTATUS(status));
                    } else if (WIFSIGNALED(status)) {
                        printf("killed by signal %d\n", WTERMSIG(status));
                    } else if (WIFSTOPPED(status)) {
                        printf("stopped by signal %d\n", WSTOPSIG(status));
                    } else if (WIFCONTINUED(status)) {
                        printf("continued\n");
                    }
                } while (!WIFEXITED(status) && !WIFSIGNALED(status));
            }else{
                wait(NULL);
                //exit(EXIT_SUCCESS);
            }
        }            
        

        if(strcmp(argumentos,fim) == 0) exit(EXIT_SUCCESS);
        printf("%s",prompt);

    }

    return 0;
}