Primordius Posted October 9, 2012 at 10:49 AM Report #478386 Posted October 9, 2012 at 10:49 AM (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 October 9, 2012 at 10:52 AM by pmg falta LP
KTachyon Posted October 9, 2012 at 11:18 AM Report #478390 Posted October 9, 2012 at 11:18 AM 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
brunoais Posted October 9, 2012 at 12:07 PM Report #478394 Posted October 9, 2012 at 12:07 PM 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%.
KTachyon Posted October 9, 2012 at 12:41 PM Report #478396 Posted October 9, 2012 at 12:41 PM 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
Primordius Posted October 9, 2012 at 01:15 PM Author Report #478400 Posted October 9, 2012 at 01:15 PM 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 🙂
KTachyon Posted October 9, 2012 at 01:28 PM Report #478403 Posted October 9, 2012 at 01:28 PM 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
Primordius Posted October 9, 2012 at 03:42 PM Author Report #478425 Posted October 9, 2012 at 03:42 PM 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
HappyHippyHippo Posted October 9, 2012 at 03:47 PM Report #478426 Posted October 9, 2012 at 03:47 PM 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 Portugol Plus
Primordius Posted October 9, 2012 at 03:49 PM Author Report #478428 Posted October 9, 2012 at 03:49 PM Espero bem que sim senao tou Fo**** a Sistemas Operativos xD
KTachyon Posted October 9, 2012 at 05:04 PM Report #478442 Posted October 9, 2012 at 05:04 PM 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
aladino77 Posted October 9, 2012 at 07:03 PM Report #478474 Posted October 9, 2012 at 07:03 PM (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 October 9, 2012 at 07:54 PM by aladino77 falta GeSHi
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now