AJBM Posted February 21, 2013 at 07:49 PM Report #496523 Posted February 21, 2013 at 07:49 PM Boas! Eu tenho este codigo, #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(){ int i; for(i=0;i<2;i++){ if(fork()==0){ printf("[%d],Serei pai ou filho\n",getpid()); } } return 0; } e eu tinha de saber sem executar o código quantas vezes aparecia a mensagem, Eu sei que a mensagem aparece 3 vezes. Eu penso que seja assim P1-o que esta a executar o código P2- filho do p1 em i=0, mostra a mensagem por causa do fork devolver 0 para o filho, P3- filho do p1 em i=1, mostra a mensagem por causa do fork devolver 0 para o filho P4-filho do p2 em i=1, mostra a mensagem por causa do fork devolver 0 para o filho
HappyHippyHippo Posted February 21, 2013 at 07:57 PM Report #496525 Posted February 21, 2013 at 07:57 PM sim, a mensagem aparece 3 vezes, 1 para cada processo filho que é criado. isto porque a mensagem é apresentada somente ao processo ao qual o resultado da chamada da função fork, lhe aparece como 0. como ao processo pai, o resultado é o número do processo filho (não é 0) então a mensagem não é apresentada. conclusão, o que tens escrito para o P4 está errado. exercíco : tenta agora por o processo pai esperar que os três processes filhos terminem, e só depois terminar IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted February 21, 2013 at 09:50 PM Author Report #496545 Posted February 21, 2013 at 09:50 PM Mas o processo P2 não vai criar um processo? #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(){ int i; for(i=0;i<2;i++){ if(fork()==0){ printf("[%d],Serei pai ou filho\n",getpid()); }else{ wait(NULL); } } return 0; }
HappyHippyHippo Posted February 21, 2013 at 10:10 PM Report #496556 Posted February 21, 2013 at 10:10 PM Mas o processo P2 não vai criar um processo? #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(){ int i; for(i=0;i<2;i++){ if(fork()==0){ printf("[%d],Serei pai ou filho\n",getpid()); }else{ wait(NULL); } } return 0; } não, somente o processo pai é que cria processos. tens de perceber que o código do processo filho "começa" no retorno da função fork, e como podes ver, não existe criação de processos após essa chamada. exercício : ok, isso é uma interpretação do exercício, o que queria dizer seria : "o processo pai cria os três processos e depois espera que os três terminem para este terminar também IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted February 21, 2013 at 10:14 PM Author Report #496557 Posted February 21, 2013 at 10:14 PM eu fiz umas pequenas alterações ao código de cima. #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main(){ int i; for(i=0;i<2;i++){ if(fork()==0){ printf("[%d\\%d],Serei pai ou filho\n",getpid(),getppid()); } else{ wait(NULL); } } return 0; } O resultado foi este: [2446\2445],Serei pai ou filho [2447\2446],Serei pai ou filho [2448\2445],Serei pai ou filho 2445 é o pai, os outros são os filhos o 2446 cria um filho?
HappyHippyHippo Posted February 21, 2013 at 10:30 PM Report #496560 Posted February 21, 2013 at 10:30 PM (edited) por amos de deus ... indenta o código !! o que aconteceu foi puro acaso ... basta pores o filho a esperar um tempo qualquer que o resultado será diferente o que acontece é que o processo filho ganha tempo do processador antes do processo pai terminar o ciclo o que leva a que seja esse a criar o processo referido. mas uma coisa é certa, o segundo valor do primeiro output será sempre o id do processo inicial. --- exercício : continuas a não fazer o processo inicial esperar pelo termino dos processos filhos, e já agora, podes prevenir que o que aconteceu suceda com um return dentro do "if" Edited February 21, 2013 at 10:31 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted February 21, 2013 at 10:50 PM Author Report #496574 Posted February 21, 2013 at 10:50 PM Em relaçao a indentacao quando eu copio para aqui perde a indentação Pensava que o wait era suposto fazer isso? No entanto fiz algumas alteraçõesmesmo assim o resultado continua o mesmo. Colocar o return dentro do if reduziu as mensagens , para duas mensagens #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main() { int i; pid_t pid; pid=getpid(); for(i=0;i<2;i++){ if(fork()==0){ printf("[%d\\%d],Serei pai ou filho\n",getpid(),getppid()); } else if(pid>0){ wait(NULL); } } return 0; }
Rui Carlos Posted February 21, 2013 at 10:53 PM Report #496575 Posted February 21, 2013 at 10:53 PM o que aconteceu foi puro acaso ... basta pores o filho a esperar um tempo qualquer que o resultado será diferente o que acontece é que o processo filho ganha tempo do processador antes do processo pai terminar o ciclo o que leva a que seja esse a criar o processo referido. Já não mexo em processos há muitos anos, mas acho que o raciocínio inicial do AJBM estava correcto. Para i=0 só há um processo, que cria um processo filho. Para i=1 já temos ambos os processos a chamarem o fork(), e cada um deles cria um filho. Colocar um return dentro do if produz um resultado diferente, pois nesse caso o processo filho não passa para a 2ª iteração (logo só o pai é que cria mais processos). Rui Carlos Gonçalves
HappyHippyHippo Posted February 21, 2013 at 11:00 PM Report #496578 Posted February 21, 2013 at 11:00 PM 1º - sim duas mensagens, quando i = 0 e quando i = 1. como vês, desta forma o processo filho não executa o "for" exercício : continuas longe da solução do pai esperar pelos três filhos, eu disse que ele esperaria somente depois de os criar (a todos) solução: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main() { int i, pid, pids[3]; printf("%d is the parent process\n", getpid()); for(i = 0; i < 2; i++) { printf("%d creating process\n", getpid()); if((pid = fork()) == 0) { // código do processo filho printf("[%d\\%d],Serei pai ou filho (%d)\n", getpid(), getppid(), i); return 0; } else { // código do processo pai // guardar o id do processo filho criado pids[i] = pid; } } // este código só é executado pelo processo pai for(i = 0; i < 2; i++) { waitpid(pids[i], NULL, 0); } return 0; } ------------------------------ Já não mexo em processos há muitos anos, mas acho que o raciocínio inicial do AJBM estava correcto. Para i=0 só há um processo, que cria um processo filho. Para i=1 já temos ambos os processos a chamarem o fork(), e cada um deles cria um filho. Colocar um return dentro do if produz um resultado diferente, pois nesse caso o processo filho não passa para a 2ª iteração (logo só o pai é que cria mais processos). sim tens razão, a indentação estava a confundir-me, assim como distracção minha IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted February 21, 2013 at 11:09 PM Author Report #496580 Posted February 21, 2013 at 11:09 PM #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main() { int i, pid, pids[3]; printf("%d is the parent process\n", getpid()); for(i = 0; i < 2; i++) { printf("%d creating process\n", getpid()); if((pid = fork()) == 0) { // código do processo filho printf("[%d\\%d],Serei pai ou filho (%d)\n", getpid(), getppid(), i); return 0; } else { // código do processo pai // guardar o id do processo filho criado pids[i] = pid; } } // este código só é executado pelo processo pai------PORQUE QUE ESTE CODIGO É SO EXECUTADO PELO PAI ? for(i = 0; i < 2; i++) { waitpid(pids[i], NULL, 0); } return 0; }
HappyHippyHippo Posted February 21, 2013 at 11:12 PM Report #496581 Posted February 21, 2013 at 11:12 PM if((pid = fork()) == 0) { printf("[%d\\%d],Serei pai ou filho (%d)\n", getpid(), getppid(), i); return 0; // <--------------- TERMINA O PROCESSO FILHO } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted February 21, 2013 at 11:16 PM Author Report #496582 Posted February 21, 2013 at 11:16 PM (edited) OK. obrigado 👍 Ja agora Considerando que o seguinte programa em C está a executar com o PID 3202: fork(); fork(); fork(); fork(); Indique, justificando, quantos processos são criados pelo processo com o PID 3204. Eu penso que sejam 2, mas não tenho a certeza Edited February 21, 2013 at 11:16 PM by AJBM
HappyHippyHippo Posted February 21, 2013 at 11:33 PM Report #496585 Posted February 21, 2013 at 11:33 PM resposta: "assumindo que os id's a serem atribuídos a cada processo criado, sejam contíguos (se bem me lembro, em linux não é garantido) o número de processos que o processo com o PID 3204 criará serão 2. seja o processo inicial ou o primeiro processo criado (supostamente o 3203), o processo 3204 será sempre um processo criado pela chamada do segundo fork da lista de 4 chamadas existente no código." IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted February 21, 2013 at 11:43 PM Author Report #496587 Posted February 21, 2013 at 11:43 PM ok. obrigado 👍
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