• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ejpvb

Listar directorias em UNIX

20 mensagens neste tópico

Olá Bom Dia,

Sou nova neste forum, mas precisava de uma ajuda para um projecto que queria fazer. Agradecia se me podessem ajudar.

Problema

Implementar uma versão simplificada do comando ls dos sistemas UNIX. O programa executável deve ter o nome mls, e aceitar as seguintes opções, com as funcionalidades indicadas:

-l listagem com detalhes

-a listar os ficheiros e directorias com nome iniciado por um ponto (normalmente estes nomes não são listados)

-s ordenar a listagem de forma ascendente pelo nome dos ficheiros/directorias

-r ordenar a listagem de forma descendente pelo nome dos ficheiros/directorias

Para além destas opções, o comando deve permitir indicar, a seguir às opções, o nome da directoria a listar. Se não for indicado um nome, deve ser listada a directoria actual. Quando é indicado um nome, é sempre o último parâmetro, e nunca começa com um hífen (ao contrário das opções).

O formato das listagem deve ser semelhante ao do comando ls. No caso da listagem sem detalhes, não é necessário organizar os nomes em colunas.

A ordenação da listagem, quando pedida, deve ser feita executando o comando sort num processo filho e passando-lhe os dados a ordenar (a listagem) através de um pipe.

Exemplos de invocação do comando mls:

• mls -l -a

• mls

• mls -s /etc

• mls -l -r

Como poderei fazer isto?

Obrigado

EDIT: Título editado. "Ajuda" não é muito explícito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se poder usar o system, é simples... É só chamar os comandos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

também tenho que fazer algo parecido!o problema é que não poosso usar o system...pois com o system já tenho um código mas n pode ser assim!!

agradecia que me dessem umas dicas....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
[na outra thread]

Já foi lá e não encontrei nada...não vi lá código nemhum!!!

É porque não procuraste no sítio certo.

Tens de ir ao Coreutils Savannah repository; depois em "Source Code" escolhes "Browse Sources Repository"; depois a "master" branch; no git clicas em "tree"; a directoria src tem os sources todos do coreutils.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim já vi.....mas qual é que é o source?é este:ls-dir.c?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, é esse que tem o código mais importante do `ls` do coreutils.

Muito provavelmente ele #inclui alguns ficheiros .h e, se calhar, até precisa de código de outros ficheiros de source.

De qualquer maneira, a ideia não é copiar esse código para entregar ao professor (ele vê logo que não foste tu que o fizeste): é só para ver como é que os tipos do GNU fizeram e adaptar ao teu código em caso de necessidade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim tens razão mas a unica coisa que tem é:#include "ls.h"

int ls_mode = LS_MULTI_COL;

precisava era do resto do código,pois tenho poucas bases.....

como é que continuo?como faço o resto do código?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens tudo o que precisas para listar o conteúdo de uma directoria aqui. Só tens que pegar no resultado das chamadas a readdir e formatar como é pedido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não leias o código do ls. Pensa um bocadinho e pesquisa sobre as partes específicas que não sabes.

Eu posso-te dar uma ajuda inicial:

Para fazer o parsing dos argumentos tens de declarar a função main como recebendo 2 argumentos (argc e argv[]). Depois basta leres os argumentos um a um, verificares se começam com um hífen (argv[i][0] == '-', por exemplo) e se sim, verificar qual o caracter que lhes segue para ligar as várias opções.

Depois tens de criar uma função que vai fazer o output. Para abrir um directório para listagem usas a função opendir() passando como argumento o directório. Caso tenhas recebido um directório nos argumentos, então usas esse. Senão, para obter o directório actual podes usar a função getcwd().

Para obter uma listagem do directório usas a função readdir(), que devolve um ponteiro para uma estrutura que contém o nome dessa entrada no directório. Basta ir chamando a função readdir() até ela devolver NULL, que significa que não tens mais entradas no directório. Para obter mais detalhes de cada ficheiro, usas a função stat(), que devolve uma estrutura com informações adicionais para cada entrada do directório.

Se as opções de sorting tiverem sido passadas como argumentos ao programa, crias um pipe com a chamada pipe(), que te devolve dois file descriptors, um para leitura e outro para escrita. Escreves o output para o pipe no file descriptor de escrita.

Depois tens de criar um processo filho (chamada de sistema fork() ou vfork()) seguido de um exec() para mudares o código do programa para o do sort. Substituis o file descriptor (close() seguido de dup()) do stdin pelo de leitura que recebeste na chamada de criação do pipe.

Claro que faltam alguns pormenores mas basicamente acho que é isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

abrigadão!era mesmo isto que estava a precisar....mas não me podes explicar o k

que queres dizer com:Só tens que pegar no resultado das chamadas a readdir e formatar como é pedido?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não é assim?usei as funções que disses-te....então como s faz?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"Criaste" essa função? Ou "copiaste"?

Esse código não faz o que é pedido no enunciado. Aconselho-te a leres as dicas do Triton (que descrevem bastante bem o que precisas de fazer), e a começares por uma versão mais simples do programa, que imprima o conteúdo da directoria actual. Que é o que faz o código que copiaste. Mas não te limites a copiar, tenta entender o que é que o código está a fazer, e as dúvidas que surjam coloca-as aqui.

Quanto ao "pegar no resultado e formatar"... é o que é pedido no enunciado. Pegas na estrutura que é retornada pelo readdir, vês se é uma directoria, e se for imprimes o nome e talvez "<dir>" à frente (francamente não me lembro como é formatado o output do ls), se não for, imprimes o nome e o tamanho.

Depois de fazeres isso logo te preocupas com o resto dos detalhes que são pedidos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não é assim?usei as funções que disses-te....então como s faz?

Faz-se como eu te expliquei anteriormente. Não estejas é à espera que te façam o código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

perceber tenho que perceber pois tenho que esplicar o código...mas o pior é começar,as bases que tenho são mesmo minimas!!não está fácil.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

perceber tenho que perceber pois tenho que esplicar o código...mas o pior é começar,as bases que tenho são mesmo minimas!!não está fácil.....

Mas também não estás a perguntar as partes específicas onde tens dúvidas...

E se não tens bases, tens um tutorial de C na Wiki do Portugal-a-Programar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora