Mudanças entre as edições de "AULA 24 - Programação 1 - Graduação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=Objetivos= *Representando o tempo em uma forma apropriada para comparação de hora, minuto e segundo; *Uso de '''signal''' para execução periódica de '''handlers'''. =Repre...')
 
 
(9 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 16: Linha 16:
 
   time ( &rawtime );  
 
   time ( &rawtime );  
 
   tminfo = localtime ( &rawtime );  
 
   tminfo = localtime ( &rawtime );  
   printf ( "hora: %d minuto: %d segundo: %d \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);  
+
   printf ( "hora: %d minuto: %d segundo: %d \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
 +
  printf ( "%d:%d:%d \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
 +
  printf ( "%dh%dmin%ds \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
;Exemplo: Aplicação no projeto:
+
;Exemplo:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 65: Linha 67:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=Execução Periódica de Handlers=
  
 +
Um Handlers, também chamado de manipulador de sinal, é apenas uma função que você compila em conjunto com o resto do programa. Em vez de invocar directamente a função, você usa ''signal'' ou ''sigaction'' que diz ao sistema operacional para chamá-lo quando um sinal chega. Isto é conhecido como "estabelecer o manipulador".
  
=Execução Periódica de Handlers=
+
Há duas estratégias básicas que você pode usar em funções do manipulador de sinal:
 +
 
 +
*Você pode ter a função do manipulador de perceber que o sinal chegou por ajustes, algumas estruturas de dados globais, e em seguida, retornar normalmente.
 +
*Você pode ter a função de manipulador que  ao terminar o programa, transfere o controle a um ponto onde ele pode recuperar da situação que provocou o sinal.
 +
 
 +
Você precisa ter um cuidado especial em funções do identificador de escrita, porque eles podem ser chamados de forma assíncrona. Isto é, um manipulador pode ser chamado em qualquer ponto do programa, de forma imprevisível. Se dois sinais chegam durante um intervalo muito curto, um manipulador pode ser executado dentro do outro.
 +
 
 +
;Exemplo:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 110: Linha 121:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Decompondo string com delimitadores=
+
=Decompondo ''string'' com delimitadores=
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 136: Linha 147:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
 +
 +
{| border="1" cellpadding="5" cellspacing="0"
 +
! style="background: #cdc5bf;" | [[AULA 23 - Programação 1 - Graduação | << ]]
 +
! style="background: #cdc5bf;" | Aula 24
 +
! style="background: #cdc5bf;" | [[PRG1-_Programação_I_-_Graduação | <> ]]
 +
|}

Edição atual tal como às 13h21min de 22 de junho de 2015

Objetivos

  • Representando o tempo em uma forma apropriada para comparação de hora, minuto e segundo;
  • Uso de signal para execução periódica de handlers.

Representando o tempo em uma forma apropriada para comparação de hora, minuto e segundo

#include <stdio.h>
#include <time.h>

main()
{

   time_t rawtime; 
	struct tm *tminfo; 

   time ( &rawtime ); 
   tminfo = localtime ( &rawtime ); 
   printf ( "hora: %d minuto: %d segundo: %d \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
   printf ( "%d:%d:%d \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
   printf ( "%dh%dmin%ds \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec);
}
Exemplo
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
 
typedef struct tipo_sala{
  int  salaId;
  int  hora_ent;
  int  hora_sai;
} TSala;
 
 
main()
{
   time_t rawtime; 
   struct tm *tminfo; 
   TSala Lab1;
 
   TSala *pSala;
 
   pSala = malloc(sizeof(TSala));
 
   pSala->salaId = 5;
   pSala->hora_ent = 10;   
   pSala->hora_sai = 12; 
 
 
   /* Ler o tempo real no momento */
 
   time ( &rawtime ); 
   tminfo = localtime ( &rawtime ); 
   printf ( "hora: %d minuto: %d segundo: %d \n", tminfo->tm_hour, tminfo->tm_min, tminfo->tm_sec); 
 
   if(pSala->hora_ent <= tminfo->tm_hour && pSala->hora_sai >= tminfo->tm_hour) {
       printf("Tempo atual dentro da faixa de restrição\n");
   } else {
       printf("Tempo atual FORA da faixa de restrição \n");
   }
   free(pSala);
}

Execução Periódica de Handlers

Um Handlers, também chamado de manipulador de sinal, é apenas uma função que você compila em conjunto com o resto do programa. Em vez de invocar directamente a função, você usa signal ou sigaction que diz ao sistema operacional para chamá-lo quando um sinal chega. Isto é conhecido como "estabelecer o manipulador".

Há duas estratégias básicas que você pode usar em funções do manipulador de sinal:

  • Você pode ter a função do manipulador de perceber que o sinal chegou por ajustes, algumas estruturas de dados globais, e em seguida, retornar normalmente.
  • Você pode ter a função de manipulador que ao terminar o programa, transfere o controle a um ponto onde ele pode recuperar da situação que provocou o sinal.

Você precisa ter um cuidado especial em funções do identificador de escrita, porque eles podem ser chamados de forma assíncrona. Isto é, um manipulador pode ser chamado em qualquer ponto do programa, de forma imprevisível. Se dois sinais chegam durante um intervalo muito curto, um manipulador pode ser executado dentro do outro.

Exemplo
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <unistd.h>

static signal_recv_count;

void sigalrm_handler(int signum)
{
  
  signal_recv_count++;
}

void init_timer(int tempo)
{
  struct itimerval timer={0};
  char a[200];
  /* Initial timeout value */
  timer.it_value.tv_sec = tempo;

  /* We want a repetitive timer */
  timer.it_interval.tv_sec = tempo;

  /* Register Signal handler
   * And register for periodic timer with Kernel*/
  signal(SIGALRM, &sigalrm_handler);
  setitimer(ITIMER_REAL, &timer, NULL);
}

int main()
{
  init_timer(10);

  while(1) {
  		printf("imprimindo  :%d\n", signal_recv_count);
  		sleep(1);
  }
}

Decompondo string com delimitadores

#include <string.h>
#include <stdio.h>

int main()
{
   const char string_delimitada[80] = "alfa:beta:delta:epson";
   const char s[2] = ":";
   char *token;
   
   /* Ler o primeiro campo passando a string em str e o delimitador em s */
   token = strtok(string_delimitada, s);
   
   /* Ler os pŕoximos campos - passar primeiro parâmetro NULL */
   while( token != NULL ) 
   {
      printf( " %s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return(0);
}


<< Aula 24 <>