Descritores de arquivo e ponteiros para os arquivos

file_decriptor

Olá pessoal!

Neste post apenas replico uma informação que contém a definição de descritor de arquivos.  Este post será parte de outro post sobre Socket que está sendo elaborado.

Foi visto que o nó de indexação de um arquivo é a estrutura de identificação do arquivo dentro de um sistema. Quando um processo quiser manipular um arquivo, ele vai simplesmente utilizar um inteiro chamado descritor de arquivo. A associação desse descritor ao nó de indexação deste arquivo se faz durante a chamada da primitiva open() (ver 1.5.4), com o descritor tornando-se então o nome local de acesso desse arquivo no processo. Cada processo UNIX dispõe de 20 descritores de arquivo, numerados de 0 a 19. Por convenção, os três primeiros são sempre abertos no início da vida de um processo:

  • O descritor de arquivo 0 é a entrada padrão (geralmente o teclado);
  • O descritor de arquivo 1 é associado a saída padrão (normalmente a tela);
  • O descritor de arquivo 2 é a saída de erro padrão (normalmente a tela).

Os outros 17 descritores estão disponíveis para os arquivos. Esta noção de descritor de arquivo é usada para a interface de Entrada/Saída de baixo nível, especialmente com as primitivas open(), write(), etc. Por outro lado, quando as primitivas da biblioteca padrão de entrada/saída são usadas, os arquivos são encontrados através dos ponteiros para os objetos do tipo FILE (tipo definido dentro da <stdio.h>).

Existem três ponteiros definidos neste caso:

  • stdin que aponta para o buffer da saída padrão (geralmente o teclado);
  • stdout que aponta para o buffer da saída padrão (normalmente a tela);
  • stderr que aponta para o buffer da saída de erro padrão (normalmente a tela).

fonte: https://www.dca.ufrn.br/~adelardo/cursos/DCA409/node17.html

Anúncios

02 – Compilando o seu programa em C no Linux

Hello friends!

Bem, não vou embromar muito porque tenho que ir embora. Então, Let’s go Bob.

 

 

 

 

fonte: https://mastigado.wordpress.com

Hoje vou deixar aqui a forma como eu acredito que deveríamos compilar o nosso programa em C no Linux, baseado no que meu professor meu ensinou.

Bem, se você tem um arquivo em C no Linux, quando for compilar o seu fonte utilize a seguinte sintaxe:

Para um arquivo

gcc -Wall -Wextra -c file.c

Para vários arquivos

gcc -Wall -Wextra -c file1.c file2.c file3.c

Onde:

  • gcc: Significa que é o compilador que você utilizará para compilar o seu código em C;
  • -Wall: Significa que você quer que todos os warnings sejam mostrados durante o processo de compilação do seu código;
  • -Wextra: Quer dizer que você também deseja ver outros warnings extras que podem existir num processo de compilação;
  • -c: Este é utilizado para dizer que determinado arquivo ou arquivos está ou estão sendo compilados e a consequência disso é que ele irá gerar um arquivo com extensão “o” de objeto;

Logo após este processo é hora de gerar o seu programa executável. E você poderá gerá-lo desta forma abaixo:

Para um arquivo

gcc -o programa file.o -lcurses

Para vários arquivos

gcc -o programa file1.o file2.o file3.o -lcurses

Onde:

  • -o: Significa que estou me referindo ao meu objeto gerado durante o processo de compilação e transformando-o num executável, que chamei de programa. No Ruindows o programa executável tem extensão e é do tipo exe.
  • -lcurses: É um parâmetro para adicionar a biblioteca do C utilizada para utilizar cores, dar suporte à mouse, etc. Você pode consultar sobre a biblioteca NCurses neste post do site Viva o Linux.

Para um arquivo de forma simplificada

gcc file.c -o file

Bem, agora temos o nosso programa e que geramos inclusive com o nome de programa! Para executá-lo você pode digitar o seguinte comando:

./programa ou sh programa

Algumas considerações:

Para instalar a biblioteca NCurses no Linux Debian ou em outras distribuições derivadas dele, utilize o comando abaixo no terminal:

apt-get install libncurses5-dev libncursesw5-dev

Para instalar a biblioteca que contém outras bibliotecas essenciais para a compilar e outras coisas:

 
apt-get install build-essential

Fica ao seu critério.

fonte: https://mastigado.wordpress.com

Tá aí! Mastigado!

01 – Aprendendo C no Linux : )

Olá pessoal!

Já faz um tempo que não posto aqui e por isso voltei. : )

Bem, hoje eu pretendo começar a colocar um passo a passo do que sei de C. Talvez não seja muita coisa, mas pretendo colocar aqui algumas coisas para eu lembrar sempre quando precisar. Ok, vamos lá então.

fonte: https://mastigado.wordpress.com

Abra o console do Linux(sim, do Linux mesmo, se quiser usar o Ruindows fique à vontade também) e comece a escrever:


#include <stdio.h>
#include <stdlib.h>

int main ()
{
   float fAltura, fPeso;
   char cSexo;

   printf ("Qual sua altura?\n");
   scanf ("%f",&fAltura);
   printf ("Qual o sexo da pessoa?\n");
   printf ("Digite 'm' para Masculino e 'f' para Feminino \n");
   scanf ("%c",&cSexo);

   if ( cSexo == 'm' )
   {
      fPeso = ( 72.7 * fAltura ) - 58;
      printf ("Seu peso ideal e %f\n",fPeso);
   }
   else
      if ( cSexo == 'f' )
      {
         fPeso = ( 62.1 * fAltura ) - 44.7;
         printf ("Seu peso ideal e %f\n",fPeso);
      }
      else
         {
            printf ("Sexo Invalido!\n");
         }

      system ("pause");
      return (0);
}

Ok, ok.

E o que este programa faz?

Ele pede para que você digite a altura e o sexo de uma determinada pessoa. Aff, mas que chato!

E para que serve aquele tal de #include<stdio.h> na primeira linha do código?

Para você poder utilizar funções como o scanf(já utilizado no código). Mas o que é uma função? Pois é, a grosso modo é procedimento que faz algo para você, bastando apenas depois de pronto, se quiser utilizá-lo, chamá-lo pelo seu nome. No caso acima chamamos as funções printf, scanf, system e return.

E na 2ª linha, o que é #include<stdlib.h>?

Bem, esta aí é outra biblioteca inserida no nosso código para utilizarmos outra função do C que também utilizamos acima e é chamada de system.

Mas, biblioteca não é aquela que tem na escola?

É, digamos que a nossa biblioteca contém uma série de instruções que às vezes precisamos acrescentar para nosso programa.

Tudo bem e este tal de int main()?

Olha, para executarmos um aplicativo em C, ele tem que ter uma função que chamamos de principal(main) e por algumas regras(para que ele retorne o número de argumentos(veremos mais pra frente)), ela retorna um inteiro. Inteiro? Mas o que é isso? Retorna um inteiro? Como assim? Seria como se eu jogasse um mamão pela metade para você e daí você me retorna um inteiro? É isso mesmo?

Senhores, não é isso.

Na linguagem C e nas outras que conheço, para referenciarmos as coisas, utilizamos os chamados “tipos primitivos”(sim, eu sei que existem outros tipos de tipos). Bom, eu vou deixar alguns dos que mais utilizamos descritos abaixo.

int – Só recebe números sem casas decimais definidas(este tal de int é um inteiro e sai algo do tipo: -3, -2, -1, 0, 1, 2, 3, etc);

float – Recebe números com casas decimais(aqueles 3.5, 5,2 e por aí vai);

char – Recebe os que chamamos de caracteres do tipo string, ou seja, de todo o tipo.

Então, vamos lá.

Se você observar, após o main, nós declaramos dois campos do tipo float(fAltura e fPeso) e eu ainda coloquei uma letra “f” antes para lembrar para todos que se trata de um float mesmo.

Logo após a declaração das variáveis float, declarei uma variável do tipo char chamada cSexo e que servirá também para o nosso programa.

Bem e o que este programa faz(tô perguntando isso novamente)?

Ele verifica se a pessoa é do sexo feminino ou masculino e com base na altura informada, ele calcula o peso ideal para aquela pessoa. Útil né?

Depois de declaradas as variáveis que iremos utilizar no nosso programa(lembre-se que é boa prática de programação a declaração de variáveis logo no começo de sua função(seja ele a principal(main) ou não), utilizamos o comando printf que é utilizado para exibir alguma coisa na tela. A primeira frase a ser exibida é “Qual é a sua altura?\n“. E é claro que você reparou este “\n” no final da frase e este “cara” quer dizer que na próxima vez em que for exibida alguma coisa na tela, este será feito na outra linha, porque “\n” significa que é um caractere de salto de linha.

Abaixo da linha onde está contido o primeiro comando printf, existe a linha que contém o comando scanf. Pois bem, este tal de scanf é responsável para ler uma entrada de dados vindo do seu teclado para dentro de uma variável. E olha que maravilhoso, você pode escolher em qual das variáveis que você declarou lá em cima que irá armazenar o que você deseja. Bem, então raciocinemos um pouco e pensemos que se eu faço uma pergunta para alguém sobre qual seria a altura dela, provavelmente eu não gostaria que ela me respondesse algo do tipo um metro e setenta, mas sim 1,7 correto? Então meus amigos, podemos supor que declaramos a nossa variável chamada fAltura para receber este tipo de argumento que esperamos(1,7 ou 1,56 ou 1,90 e por aí vai). Ok, então fica algo deste tipo:

scanf(“%f”,”&fAltura”);

Onde “%f” nos informa que queremos ler a informação para uma variável do tipo float. Sim, você pode até pensar que se já declaramos uma variável do tipo float, não deveríamos ter de colocar novamente esta informação aí, mas temos sim, pois ali estamos dizendo que tipo de valores serão lidos do teclado. Já onde está escrito “&fAltura” quer dizer em qual variável iremos guardar esta informação. Mas peraê, e este “&” aí? Pois é pessoal, quando colocamos o símbolo & antecedendo uma variável quer dizer que queremos gravar a informação no endereço de memória dela. Wooowww! O que que é isso? No endereço de memória? Por que isso não é automático sem termos de precisar ficar colocando este “&” antes? Simples, você está estudando C, uma linguagem de médio nível e daí, temos que detalhar as coisas um pouquinho mais. Mas peraê novamente e se não colocarmos esta informação antes? Simples, não irá gravar nada dentro da variável, pois quando gravamos no endereço de memória de uma variável, estamos gravando o dado no lugar onde ela realmente está. Em outras palavras, quando gravamos o dado sem o &  é como se um desconhecido passasse num carro fazendo bundalêlê para você, mas provavelmente isso não faria diferença para você, mas se todos os seus amigos te desprezassem de uma só vez, você sentiria isso porque todos eles te desprezaram colocando um “&” na frente do desprezo. Ênfú, que explicação sem noção! Mas lembrando, existem duas formas de se gravar um dado numa variável, uma é quando se está lendo um dado a partir de um dispositivo de entrada(o teclado por exemplo), que neste caso é necessário colocar o “&” antes do valor da variável e a outra maneira é por atribuição, mas desta forma não é necessário colocar este “&” antes.

Olha, mais abaixo tem outros printf e um outro scanf, mas o raciocínio é mesmo, só que invés de float é char e char meus amigos, aceita letras e números. Entendido? Espero que sim. Ah, você pode ter pensado “se char também aceita números, por que eu não declarei fAltura como char“? Simples, não dá para fazer contas de subtração, divisão, multiplicação e adição com char e sim somente com float e int(inteiro). Agora sim, entendido? Ah muleque!

Bom, agora tem uma tal de if descrito desta forma:

if( cSexo ==  ‘m’ ){

Ok, ok. Este if é o que chamamos de condição ou condicional ou como você preferir. A função dele é colocar uma condição no meio do caminho do programa para você prosseguir. Mas como assim? Imagine a seguinte situação, alguém quer entrar na sua casa e você diz que só pode entrar se a pessoa disser “por favor”, e se não disser, você não deixa ela entrar. Pronto, este é nosso if! Vamos traduzir para o nosso programa acima. Se dentro da variável cSexo estiver contida a letra m, duas coisas acontecerão:

fPeso = ( 72.7 * fAltura ) – 58;
printf (“Seu peso ideal e %f\n”,fPeso);

Primeiro, a variável fPeso receberá o resultado da conta que está à direita do sinal “=”. Mas e aí, o que significa este sinal “=”, não quer dizer “igual”? Não meus amigos, o sinal de igualdade na linguagem C é representado por “==” e o sinal “=” quer dizer que o que está à esquerda está recebendo o valor do que está à sua direita. Ai ,ai, como assim? No caso acima, a variável fPeso está recebendo o valor de 72,7 vezes o valor contido na variável fAltura, menos 58, ok? Agora, logo abaixo há outra instrução printf, só que desta vez não há somente texto a ser exibido na tela, mas também um valor de variável. Onde está escrito %f quer dizer que após a letra “e”, será exibido um valor do tipo float(número decimal) e após o fechamento das aspas e da vírgula é onde é identificado de qual variável sairá este valor. Espero que tenham entendido isso.

Mais abaixo deste primeiro if, há uma instrução chamada else, que quer dizer senão. Bem, se no if você pode dizer que se(if) uma variável conter a letra “m” você faz determinada coisa, no else significa que se esta variável NÃO conter a letra “m”, você faz outra coisa. O else sempre é o contrário do if. Veja outros exemplos magníficos: Se(if) você é bonito demais, você vai ganhar o beijo de uma princesa, senão(else), você deverá ganhar muito dinheiro para ter várias mulheres. Daí, você pode ter vários ifs dentro de elses e isto é chamado de ifs aninhados.

E para finalizar, aquela instrução system(“pause”) é utilizada no Ruindows para que o terminal não feche automaticamente(só no Ruindows) e a função return passando o parâmetro 0, quer dizer que o programa principal está retornando o número inteiro zero.

fonte: https://mastigado.wordpress.com

Bem gente, é isso aí, tá muito mastigado.

próximo post: 02 – Compilando o seu programa em C no Linux

%d blogueiros gostam disto: