Newsgroup: it.comp.lang.c
Titolo: problemi con la fork

prima dell'if oppure ho sbagliato qualcosa?
in che senso?






mmm mi sa che siamo ot perchč la fork() č un primitiva *NIX cmq ti dň
un suggerimento veloce:
man fork
man wait
es:
//...//
int pid, status;
if (pid = fork() == 0) {
	// codice figlio
}
else
{	
	wait(&status);
	// codice padre
}
nella variabile pid č contenuto il pid del figlio, l'istruzione wait
fa in modo che il padre aspetti la fine del figlio, ma se devi farli
lavorare in parallelo toglila


mi saprebbe illustrare anche con qualche riga di codice come fare?
1) La fork() non e' standard, quindi avresti dovuto postare su un ng
specifico per la programmazione sotto Unix e ti consiglio di farlo
visto che li troverai risposte esaurienti
2) La fork() restituisce un valore di ritorno... fai un bel man fork e
scopri quali sono questi valori e cosa vogliono dire e risolverai il
tuo problema
3) in parallelo e' possibile, ma a pripri non lavorano in modo
sincronizzato. Se vuoi che si sincronizzino devi sbatterti, studiando
il metodo con cui il sisop su cui lavori usa i lock e la memoria
condivisa.
Mox :)


rhy...@myself.com
--------------------------------
Inviato via 
http://usenet.iol.it
 

 wrote:
:
: >Ho un problema cioč quello di creare un processo padre che chiama un
: >processo figlio che fa una cosa in parallelo ed indipendente dal padre.
hi
: >mi saprebbe illustrare anche con qualche riga di codice come fare?
:
: mmm mi sa che siamo ot perchč la fork() č un primitiva *NIX cmq ti dň
: un suggerimento veloce:
:
: man fork
: man wait
:
: es:
:
: //...//
: int pid, status;
: if (pid = fork() == 0) {
 if ((pid = fork()) == 0) {
: // codice figlio
: }
: else
: {
   if ( pid != -1 ) // non in caso d'errore
     wait(&status);
: // codice padre
: }
:
ciao
Massimo

Massimo
il problema è che il figlio
mi esegue anche quello prima dell'if ed io questo non lo vorrei


a b
Certo perchè al momento della fork() il figlio si piglia l'area dati e
codice del padre..


 if ((pid = fork()) == 0) {
e pensi che sia errore il mio? ^_^


 wrote:
:
: >: if (pid = fork() == 0) {
: >
: > if ((pid = fork()) == 0) {
:
: e pensi che sia errore il mio? ^_^
Dipende da cosa vuoi fare:
/*************************/
#include <stdio.h>
int fork15(void)
{ return 15; }
int fork0(void)
{ return 0; }
int main()
{
  int pid=3;
  printf( "Simulo fork() che restituisce 0\n" );
  if ( pid = fork0() == 0 )
    printf( "then: pid = %d\n", pid );
  else
    printf( "else: pid = %d\n", pid );
  printf( "Simulo fork() che restituisce 15\n" );
  if ( pid = fork15() == 0 )
    printf( "then: pid = %d\n", pid );
  else
    printf( "else: pid = %d\n", pid );
  getchar();
  return 0;
}
/*************************/
output:
Simulo fork() che restituisce 0
then: pid = 1
Simulo fork() che restituisce 15
else: pid = 0
output compilatore:
[C++ Warning] Unit1.c(13): W8060 Possibly incorrect assignment
[C++ Warning] Unit1.c(19): W8060 Possibly incorrect assignment
ciao
Massimo

"chianese vincenzo" ha scritto
:
:
: il problema è che il figlio
: mi esegue anche quello prima dell'if ed io questo non lo vorrei
:
A me no. Esempio (cygwin su win98) :
#include <sys/types.h>
#include <unistd.h>
int main()
{
  int status;
  printf( "Before\n" );
  switch( fork() )
  {
    default:
      sleep( 2 );
      printf( "Father\n" );
      wait( &status );
      break;
    case 0:
      printf( "Child\n" );
      exit( 0 );
    case -1:
      printf( "Error\n" );
  }
  return 0;
}
output:
Before
Child
Father
ciao
Massimo

 
rhy...@myself.com

e quindi cosa dovrei fare io ho provato con execl va bene?
dovrebbe funzionare, dato che crei li l'ambiente è differente.


dovrebbe funzionare, dato che crei li l'ambiente è differente.
dovrebbe funzionare dato che con l'istruzione crei un ambiente
differente ^_^


  printf("c");
Mai sentito parlare di fflush()? Quella cosa che tanti (io compreso)
usavano erroneamente per svuotare stdin?
Beh, prova a lanciarla prima di forkare e a postare su un ng che parla
di unix :P
Mox :)

e pensi che sia errore il mio? ^_^
Come ti e' gia' stato detto dipende da cosa volevi fare.
Certo che asegnare il pid per poi non salvarlo direi che non e' molto
utile.
Mox