Cap. 2 - Sistema de Processos

Lab. 2.1 - Chamada de Sistema "fork(..)" no UNIX

 

1. Executa 02 chamadas de sistema: getpid(..), getppid(..). Ambas retornam o identificador do processo corrente e o identificador do processo que gerou o processo corrente, ou seja, processo pai.

  
  /* hll-wrld.c - imprime "Hellow World" */

  /* **************************************** Includes */
  #include 

  /* ************************************************** Main Program */
  int main( int argc, char* argv[] )
  {
    printf("Processo \"Hello World\" - Pid: %d \n", getpid());
    printf("Processo PAI \"bash\" - Pid: %d \n", getppid());
    exit(0);
  }
 

2. Constroi uma arvore "genealogica" de processos invocando a chamada fork(..) em um laco por 03 vezes. Mas depois do primeiro laco, tanto o processo que gerou o primeiro filho quanto o processo filho estao aptos a gerar descendentes. O mesmo raciocinio deve ser feito para o 3o laco e, neste caso, 04 processos irao gerar descendentes. Dentre eles, teremos o 1o processo, seus filhos, filhos de seus filhos e filhos de filhos de seus filhos.

  
  /* fmly-prc.c - utiliza as chamadas fork(), getpid(), wait(). */

  #include 
  #include 
  #include 

  void create_process( void ) {
    int pid;
  
    printf("   Pid FILHO: %d ... processando ...\n", getpid() );
  }

  int main( int argc, char* argv[] )  {
    int i, pid;

    for( i=1; i<=3; i++ )  {
      printf("%d: ", i);
      pid = fork();
      if( pid == 0 )
        printf("    FILHO: %d ... processando ...\n", getpid() );
      else
        printf("Pid PAI: %d  - Pid FILHO: %d.\n", getpid(), pid );
    }

    wait(NULL); /* Sincroniza com os Processos Filhos */
    return 0;
  }
 

3. Quando o usuario executar Ctrl-C, um sinal do tipo SIGINT e enviado ao processo que esta executando em foreground. O comportamento default para este processo e o termino do processo. Toda vez que um SIGINT for enviada para o processo, a funcao "sign-hnd" e chamada assincronamente solicitando confirmacao do termino da execucao e caso o usuario responda "n", a funcao retorna e o programa continua normalmente sua execucao.

  
  /* sign-hnd.c - captura interrupcoes do teclado. */

  #include 
  #include 
  #include 

  /* **************************************** Includes */
  #include 

  /* ************************************************** signal_hand */
  void signal_hand( int arg ) {
    int ch;

    printf("Tem certeza que quer Finalizar [s/n] ? ");
    ch = getchar();
    if( ch == 's' || ch == 'S' )  exit( 0 );
  }

  /* ************************************************** Main Program */
  int main( int argc, char* argv[] )
  {
    int i;

    printf("Processo: ... processando ...\n");
  
    signal( SIGINT, signal_hand );

    for( ; ; ) ;
    printf("Processo: ... processando ...\n");
    exit(0);
  }
 

 


Luís Fernando Faina
Last modified: Wed Sep 4 07:57:02 2002