Jump to content

Recommended Posts

Posted (edited)

Bom dia, eu tenho que fazer a seguinte função

Construa um interpretador elementar de comandos capaz de suportar os seguintes comandos (e respectivos argumentos/opções) introduzidos pelo utilizador:

  • dir - executa o comando Unix ls seguido de pwd;
  • copy - executa o comando unix cp;
  • delete - executa o comando unix rm;
  • edit - executa gedit (editor de texto);
  • quit - sai da shell.

ja tenho tudo feito e a funcionar bem, com excepção do quit...

e não estou a perceber a razao disto nao funcionar

//codigo....
//algures aqui
result = fork();
scanf("%s",cmd);
//codigo...

//exit
if (result == 0 && strcmp(cmd, "quit") == 0)
{
exit(1);
}

e quanto eu escrevo quit o programa nao faz nada, a nao ser que isto esteja a devolver/terminar o processo filho nao saindo assim do programa (que é esse o objectivo)

Muito Obrigado

Edited by pmg
falta LP
Posted

Podes mostrar os includes que estás a fazer?

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Quando é que o processo filho termina?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

Só um dos dois é que vai receber o input (aquele que executar o scanf primeiro). O processo filho vai terminar assim que recebe o "quit", enquanto que o processo pai vai continuar a executar o que vier depois do if. Se o pai terminar primeiro, o processo filho fica orfão, mas continua a fazer o que tem a fazer.

O código parece correcto, se for esta a intenção. Agora, não esquecer que vais ter dois processos a tentar receber informação do stdin e não vão ler a informação simultaneamente.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

devo ter que meter um else { exit(1);} vou exprimentar depopis digo qqer coisa

os includes que tou a fazer sao estes

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

já concegui xD o else funcionou bem, obrigado pla ajuda 🙂

Posted

Pah, o teu problema é capaz de não ser o else. Quando fazes o fork vais ter dois processos a competir pelo stdin logo de seguida. Aquele que chegar primeiro ganha. Se o processo pai for o primeiro a tomar controlo do stdin, quando fizeres quit, não vai acontecer nada (vai continuar a executar o que vem depois do if). Se o processo filho tomar controlo do stdin antes do pai, quando fizeres quit, o processo filho termina.

Não é uma questão de meteres o else, até porque se queres que o primeiro processo saia quando receber um "quit", nesse caso só tens que tirar o result == 0 &&, que é o que define que só o processo filho é que entra nessa condição.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

entao quando bastame meter que ao receber o quit aquilo faz exit? faz sentido bgd vou exprimentar

*edit* funcionou bem obrigado pla dica!!! 😄 estas coisas dos processos filhos e pais sao uma beca complicadas ao inicio

Posted

estas coisas dos processos filhos e pais sao uma beca complicadas ao inicio

sim é complicado porque uma pessoa tem o ponsamento moldado para programas com um único fio de execução. como se fosse uma pessoa a correr sozinha. agora tens de pensar que tens várias pessoas a correr ao mesmo tempo e existe obstaculos que só podem ser transpostos com mais de uma pessoa, logo é necessário que alguém espero por outra pessoa (fio de execução).

é um passo que toda a gente passa mas vais ver que isso é rápido

IRC : sim, é algo que ainda existe >> #p@p
Posted

entao quando bastame meter que ao receber o quit aquilo faz exit? faz sentido bgd vou exprimentar

*edit* funcionou bem obrigado pla dica!!! 😄 estas coisas dos processos filhos e pais sao uma beca complicadas ao inicio

Epah, eu não sei exactamente o que tu queres fazer. Mas tens que te lembrar que, quando escreves "quit<enter>", isso só vai ser apanhado por um processo. Ou pelo pai, ou pelo filho. É aleatório. Tu só sais do programa e voltas para a shell se o processo pai terminar e o filho ficar orfão. Não te esqueças que, quando isso acontece, o processo filho nunca é terminado, até porque nunca mais vais conseguir interagir com ele através do stdin e tens que o matar manualmente.

Se ainda não tiveres percebido aquilo que eu estou a tentar explicar é provável que ainda tenhas o exercício mal feito.

Aliás, eu não sei exactamente qual é que é a ligação entre ter um processo filho e aquilo que está no exercício que indicaste no primeiro post. Se o objectivo é simular aqueles comandos no programa, o exit(1) é mesmo para terminar o programa e não para sair da shell.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted (edited)

Creio que o seu fork é prematuro, e além disso o filho nunca chega a terminar a execução. O pai morre e o filho fica a assumir o input. Deve ter muitos processos zombies.

Experimente algo parecido.

#define TRUE 1
#define FALSE 0

done = FALSE;

while (!done) {
  char **cmd;
  cmd = ler_cmd();
  if (!strcmp(cmd[0], "quit")) {
 done = TRUE; /* exit(0); */
  }
  else {
 int pid;
 pid = fork();
 if ( pid < 0 ) {
   perror("fork");
   exit(1);
 }

 if ( pid == 0 ) { /* filho */
   /* executar o comando */
	exit(0); /* terminar o filho */
 }
 else {
  /* pai */
   int status;
   while (wait(&status) != pid) { /* esperar que o filho termina execução do comando */
   }
 }
  }
}
Edited by aladino77
falta GeSHi

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
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. 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.