Jump to content

[Dúvida] Trabalho de FSO (C)


hjarnan
 Share

Recommended Posts

Boas pessoal, estou a fazer um trabalho para a cadeira de Fundamentos de Sistema de Operação (FSO) na linguagem C.

No trabalho é pedido que se leiam caracteres da consola, se faça a cifra de cesar nesses caracteres e depois que se envie os caracteres cifrados para um ficheiro .txt, tudo isto usando pipes.

Vou colocar mais em baixo um link para o enunciado e outro para o código que já desenvolvi para o pessoal que estiver interessado em me ajudar possa perceber melhor o trabalho.

Já vi e revi o código e não consigo compreender o que fiz de errado.. o que é certo é que não está a devolver o resultado pretendido.

Se me conseguissem ajudar era bestial.

Obrigado

Enunciado: https://min.us/mEJDblSgp

Código implementado: https://min.us/mbdWcc0dRt

Link to comment
Share on other sites

Não percebi para que servem os pipes no contexto deste problema. É suposto passares passares o input assim:

# a | b | c | d[/CODE]

?

Fazeres a cifra char a char? Não estou a perceber mesmo... Qual é a lógica dos pipes aqui? Um pipe, como diz no enunciado, é para fazeres alguma coisa com um processo e passares o output desse para o processo seguinte e assim sucessivamente. Não percebo o uso deles para fazer a cifra de César.

E já vai uns anos desde que peguei neste tipo de programação, mas não terás demasiados forks no teu código? Pelo menos eu não costumava programar assim, fazia os forks num único sitio e não espalhado pelo programa...

Vê este código que fiz à uns tempos nas minhas aulas, basicamente é uma shell tipo a bash, muito básica claro, onde são usados pipes para mandar o input de um comando para o outro (podes usar qualquer comando da bash como farias nela normalmente):

http://dl.dropbox.co...sity/SO/G08.zip

Isto só para veres como é que eu crio os pipes e respectivamente os forks. Tudo no mesmo sitio. Pode ser que ajude nalguma coisa, pois estou a achar o teu código um pouco confuso.

Edited by Nazgulled
Link to comment
Share on other sites

Não percebi para que servem os pipes no contexto deste problema. É suposto passares passares o input assim:

# a | b | c | d[/CODE]

?

Fazeres a cifra char a char? Não estou a perceber mesmo... Qual é a lógica dos pipes aqui? Um pipe, como diz no enunciado, é para fazeres alguma coisa com um processo e passares o output desse para o processo seguinte e assim sucessivamente. Não percebo o uso deles para fazer a cifra de César.

E já vai uns anos desde que peguei neste tipo de programação, mas não terás demasiados forks no teu código? Pelo menos eu não costumava programar assim, fazia os forks num único sitio e não espalhado pelo programa...

Vê este código que fiz à uns tempos nas minhas aulas, basicamente é uma shell tipo a bash, muito básica claro, onde são usados pipes para mandar o input de um comando para o outro (podes usar qualquer comando da bash como farias nela normalmente):

http://dl.dropbox.co...sity/SO/G08.zip

Isto só para veres como é que eu crio os pipes e respectivamente os forks. Tudo no mesmo sitio. Pode ser que ajude nalguma coisa, pois estou a achar o teu código um pouco confuso.

O input é passado normalmente. Um exemplo de input sería: "FNF".

Talvez este não seja o melhor problema para usar pipes, mas é um problema apenas para aprendermos a usa-los.

Citando o DAGC:

Nazgulled, os pipes que ele fala são um meio de comunicação entre processos em UNIX.

A cifra está feita carácter a carácter, porque é a única maneira possível de se fazer...

Os forks que estou a criar é para que sejam criados 3 processos filhos. O primeiro trata de receber o input dos dados do terminal, o segundo trata da cifra desses dados e o terceiro trata de enviar os dados cifrados para um ficheiro .txt, tudo isto enquanto o processo "pai" fica à espera.

O teu código está mais bem organizado, mas como estou apertado de tempo queria resolver o problema primeiro e então depois fazer uma limpeza no código.

Obrigado desde já.

Edited by hjarnan
Link to comment
Share on other sites

Eu sei o que são pipes, só que eu estava a ver o problema pelo uso deles na bash e não estava a perceber como é que seriam usados desta forma para resolver o problema. Os pipes que ele falou e os que eu falei, são os mesmos, até porque não há outros.

Realmente, pipes tem zero utilidade para o problema e na minha opinião, é um exemplo ridiculo para os aprenderes a usar. Há exemplos bem melhores (como o código que eu apresentei que é fazer uma espécie de bash). Mas adiante...

Lembro-me na altura que fiz isso que isto dos pipes era um bocado confuso e já foi prai à 2 anos por isso não sou grande ajuda agora (não é propriamente a área em que mais trabalho). Mas continuo com a ideia inicial, aqueles forks todos complica (não significa que não dê para fazer assim). Eu optava por fazer o fork sempre no mesmo sitio. Ou seja, semelhante ao meu código, mas neste caso só tens 3 pipes. Logo fazes um ciclo para 3 e dentro do ciclo fazes o fork. O pai espera sempre pelos filhos. Após o fork, ao verificares se é filho, se for, verificas em que iteração do ciclo estás, 0, 1 ou 2. Conforme isso, fazes a leitura, cifra e output para txt. Redireccionando o input/output com os pipes.

A única ajuda que te posso dar é esta. A outra seria perceber exactamente o que se passa no teu código, mas simplesmente não tenho tempo para isso. Sorry. Tenta refazer da forma que te disse a ver se chegas lá...

E o meu código estar organizado ou não é irrelevante lol. Era só para teres uma ideia de como fiz as coisas e como está comentado, ajuda-te a perceber o que se está ali passar sem teres de estar a perceber o código todo por ti próprio. Era só mesmo para teres uma ajuda de algo já feito e a funcionar.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.