Cap. 3 - Sistema de Arquivos

Lab. 3.1 - Descritores de Arquivo no UNIX

 

1. O processo "pg-sun", criado através da chamada "fork()" pelo processo "pg-father", recebe como parametros os descritores de 02 arquivos "file1.txt" e "file2.txt" abertos pelo processo pai ("pg-father"). Assim, o processo "pg-sun" não precisará abrir os arquivos para manipula-los, seus descritores já foram passados como parâmetros possibilitam ao processo FILHO manipula-los.

Os códigos referentes aos processos "pg-father.c", "pg-sun.c", "file1.txt" e "file2.txt" estão abaixo descritos, nesta ordem.

  
  /* pg-father.c - instanciacao de um processo "pg-sun" via fork(). */

  /* **************************************** Includes */
  #include 
  #include       // execl, execlp
  #include 
  #include 
  #include 

  /* ************************************************** Main Program */
  int main( int argc, char* argv[] )
  {
    int pid, fd_1, fd_2;
    char str_fd1[16], str_fd2[16];
  
    if( argc != 3 ) {
      printf("Digite: pg-father \"file1.txt\" \"file2.txt\" \n");
      exit(1);
    }

    printf("Programa \"pg-father\" lendo descritores dos arquivos: %s e %s\n",
            argv[1], argv[2] );
  
    fd_1 = open( "file1.txt", O_RDONLY, 0 );
    if( fd_1 == -1 ) {
      printf("Impossivel abrir Arquivo: %s\n", argv[1] );
      exit(1);
    }

    fd_2 = open( "file2.txt", O_RDONLY, 0 );
    if( fd_2 == -1 ) {
      printf("Impossivel abrir Arquivo: %s\n", argv[2] );
      exit(1);
    }

    sprintf( str_fd1, "%d", fd_1 );
    sprintf( str_fd2, "%d", fd_2 );
    printf("Arquivo: %s fd: %s e Arquivo: %s fd: %s\n",
            argv[1], str_fd1, argv[2], str_fd2);

    pid = fork();
    if( pid == 0 )  {  /* Processo Filho */
      execlp( "pg-sun", str_fd1, str_fd2, NULL );
      printf("Error: execlv fault!\n");
      exit(0);
    }
  
    printf("Processo PAI: ... espera Processo FILHO ...\n");
    wait(NULL);  /* Sincroniza com o Proc. Filho */
    exit(0);
  }
 
  
  /* pg-sun.c - instanciacao de um processo via fork() */

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

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

    sscanf( argv[0], "%d", &fd_1 );
    sscanf( argv[1], "%d", &fd_2 );

    printf("Processo FILHO: arquivos com descritores %d e %d serao
            manipulados!\n", fd_1, fd_2 );
    printf("Processo FILHO: ... processando ...!\n");

    exit(0);
  }
 
  
  /* file1.txt */
  Este é o arquivo 1!
 
  
  /* file2.txt */
  Este é o arquivo 2!
 

2. Os programas no ambiente UNIX não possuem nenhum conhecimento sobre o formato interno no qual o núcleo armazena os dados de arquivo. Os dados são fornecidos pelo UNIX como um "stream" de bytes, cabendo aos programas interpretarem o seu conteúdo. Este tratamento estende-se também aos diretórios, ou seja, estes são vistos como arquivos regulares. O código abaixo ilustra o programa "copy" que copia o conteúdo de um arquivo para outro.

Compile o programa "copy-fl.c" e gere o executável "copy-fl". Edite o arquivo "fl-old.txt" e modifique-o. Em seguida, execute o comando: "copy-fl fl-old.txt fl-new.txt"e observe a saída

  
  /* copy-fl.c - copia o conteudo de um arquivo para outro. */

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

  /* **************************************** Global Variables*/
  char buffer[512];

  /* ************************************************** Copy Function */
  void copy( int old, int new )
  {
    int count;
    while( (count = read( old, buffer, sizeof(buffer))) > 0 )
      write( new, buffer, count );
  }

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

    if( argc != 3 ) {
      printf("Digite: \"copy-fl fl-old.txt fl-new.txt\"\n");
      exit(1);
    }

    /* Abre Arquivo para Leitura */
    fd_old = open( argv[1], O_RDONLY );
    if( fd_old == -1 ) {
      printf("Impossivel abrir Arquivo: %s\n", argv[1] );
      exit(1);
    }

    /* Cria Arquivo novo */
    fd_new = open( argv[2], 0666 );
    if( fd_new == -1 ) {
      printf("Impossivel abrir Arquivo: %s\n", argv[2] );
      exit(1);
    }

    /* Chama copy */
    copy( fd_old, fd_new );
    printf("Copia Arquivo \"%s\" para \"%s\". \n", argv[1], argv[2]);
    exit(0);
  }
 

Arquivo "fl-old.txt" do qual os dados serão copiado para o arquivo "fl-new.txt".

  
  /* fl-old.txt - contem caracteres ASCII */
    .... .... .... .... .... ....
    .... .... .... .... .... ....
    .... .... .... .... .... ....
 
  
  /* fl-new.txt - contem caracteres ASCII */
    .... .... .... .... .... ....
    .... .... .... .... .... ....
    .... .... .... .... .... ....
 

 


Luís Fernando Faina
Last modified: Wed Sep 4 08:02:05 2002