[C] Duvida com fork

MrVerissimo

Power Member
Boas,

Gostaria de saber se ha alguma forma de partilhar memoria entre pai e filho.
O problema é o seguinte: tou a criar um programa em que o processo pai lanca um filho e este faz um sleep de determinada duracao. O que eu queria era que o filho ao acabar o sleep mudasse uma variavel no pai. Isto tudo com o pai sempre a correr. Ou seja, não me interessava comunicar por pipe, utilizar sinais etc, porque o pai ficaria parado num determinado sitio a espera da resposta do filho.
Acho que a unica forma que me daria jeito aqui seria mesmo memoria partilhada (se é que dá para fazer) mas estou aberto a sugestoes claro =).

Espero ter-me feito entender.
Obrigado desde já.

Cumps
 
porque nao queres usar sinais? :o. poderias fazer usando waitpid ou algo.
Com memoria partilhada poderia ser possivel. Usando semaforos! Da uma pesquisa nesse aspecto. Assim como se fosse um produtor/consumidor. O filho quando termina mete para a memoria, o pai quando esta algo para tirar da memoria acede e executa.

Espero ter ajudado em algo ;).
Cumps :D
 
Não te esquças que processos são diferentes de threads.
Existem é várias maneiras de inter-process comunication, daí o pessoal pensar em usá-las.
Os processos têm espaço de endereçamento diferente daí não se conseguir mudar certos valores um dos outros como nas threads. Podes ver um livro como Sistemas operativos de Tanenbaum como são as diferenças e características entre threads e processos antes de te aventurares a programar. Ou podes ver no google.
 
Obrigado pelas rapidas respostas. Já me elucidaram sobre alguns aspectos importantes. Tive a ver melhor e no meu caso é capaz de ser mais rapido de implementar o wait. Obrigado again.

Cumps
 
Boa tarde,

Tenho o seguinte código em que tenho de inserir um waitpid(), para que coloque em espera os processos pai criados, pela terminação dos filhos.

Este é o código original:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t p = fork();
pid_t k = fork();
if(p>0){
printf("p=%d: PID = %d\n", p, getpid());
sleep(45);
exit(0);
}
else if(p==0){
printf("p=%d: PID = %d\n", p, getpid());
exit(0);
}
else if(p<0){
printf("ERRO! p=%d\n", p);
exit(p);
}
}

O meu código:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
int estadoP, estadoK;
pid_t p = fork(); //P1 e P2(1)
pid_t k = fork(); //P3(1) e P4(2)

if(p>0 && k>0)
{
waitpid (p, &estadoP, 0);
waitpid (k, &estadoK, 0);
printf("Pai: PID = %d: Filho p=%d\n", getpid(), p);
printf("Pai: PID = %d: Filho k=%d\n", getpid(), k);
sleep(45);
printf("O pai acordou\n");
exit(0);
}
else if(p==0 && k==0)
{
printf("Filho p=%d: PID = %d\n", p, getpid());
printf("Filho k=%d: PID = %d\n", k, getpid());
printf("O filho terminou\n");
exit(0);
}
else if(p<0 && k<0)
{
printf("ERRO! p=%d\n", p);
printf("ERRO! k=%d\n", k);
exit(p);
exit(k);
}

}

Se os fizer apenas o primeiro fork() o código corre sem qualquer problema. Mas correndo os dois em conjunto não está a executar corretamente.
 
Back
Topo