PDA

Visualizza la versione completa : [c] creazione processi in c


nik600
04-11-2004, 08:48
ciao

vorrei ascoltare contemporaneamente una comunicazione su 2 porte, per questo credo di aver bisogno di un hread separato, uno x la porta a uno x la porta b


sapete dirmi come creare 2 thread in c?

thnks

(ho provato con fork() ma ho visto che non fa altro che creare 2 processi identici, questo non mi serve...io vorrei avere una funzione uguale da lanciare con 2 processi differenti)

marco_c
04-11-2004, 09:26
la fork crea due processi uguali padre-figlio con PID diverso.
tu poi puoi usare il processo figlio per dargli da fare dell'altro. per esempio con codice del tipo

id PID==qualcosa
fai questo
else
fai quest'altro

oppure puoi dare in pasto al processo figlio un programma/ da eseguire con la funzione exec (mi sembra di ricordare sia quella...)

nik600
04-11-2004, 09:40
TI AMO! :oVVoVe:


skerz...

/dev/null
04-11-2004, 09:47
Infatti: devi gestire i processi come ti ha spigato Marco...
Devi fare una cosa del tipo:
{
pid_t pid;
int fd_della_socket

pid = fork ( ); // forki il processo
if ( pid == 0 ) {
// codice eseguito dal paadre
// fd_della_socket = connettiti alla porta 1...
} else {
// codice eseguito dal figlio
// fd_della_socket = connettiti alla porta 2...
}
// codice eseguito da entrambi
// ...
}



Per maggiori info sulla fork: http://www.lilik.it/~mirko/gapil/gapilsu37.html#x81-510003.2.2







Puoi usare anche metodi alternativi alla fork, puoi ad esempio utilizzare i pthreads oppure puoi usare un solo processo e ascoltare entrambe le porte grazie alla select o alla poll, ma questo metodo e' sconsigliato perche' nei nanosecondi in cui leggi una socket non puoi fare altro (nemmeno leggere l'altra)...


:ciauz:

marco_c
04-11-2004, 10:05
il mio era un tantino pi pseudo-codice :fagiano:

anx721
04-11-2004, 12:48
Che voi sappiate esiste una funzione analoga alla fork su windows?

nik600
05-11-2004, 08:48
aaaaaaaaaaaarrrrrrrrrggggghhhhh :oVVoVe:

ma che bestia nera la fork()?

cosa fa con la memoria?

guardate questo pezzo di codice e ditemi (se potete):
- se io sono pazzo
- se il mio portatile pazzo
- perch succede questo



using namespace std;

#include<iostream>

int main(){
int pid1;
int i=0;
pid1=getpid();
fork();


while(1){
sleep(1);

if(pid1==getpid()){
i++;
cout<<"processo 1:"<<&i<<" = "<<i<<endl;
}else{
cout<<"processo 2:"<<&i<<" = "<<i<<endl;
}

}

return 0;
}



output del programma:



nik600@criminal:~/rete$ ./a.out
processo 2:0xbffff9a0 = 0
processo 1:0xbffff9a0 = 1
processo 2:0xbffff9a0 = 0
processo 1:0xbffff9a0 = 2
processo 2:0xbffff9a0 = 0
processo 1:0xbffff9a0 = 3
processo 2:0xbffff9a0 = 0
processo 1:0xbffff9a0 = 4
processo 2:0xbffff9a0 = 0
processo 1:0xbffff9a0 = 5



?????? setssi indirizzi di memoria e valori differenti?
come faccio a vedere il valore (aggiornato dal thread a) con una chiamata da parte del thread b?

marco_c
05-11-2004, 09:08
Originariamente inviato da nik600

?????? setssi indirizzi di memoria e valori differenti?
come faccio a vedere il valore (aggiornato dal thread a) con una chiamata da parte del thread b?

Eh.. che altro dovrebbe fare il programma? L'output giusto.
Gli indirizzi di memoria non lo so ma se non usi la funzione exec secondo me giusto che restino uguali.
Per quanto riguarda l'ultima domanda che hai fatto non l'ho proprio capita

nik600
05-11-2004, 09:12
come l'output giusto?

il processo figlio incrementa il valore di i...e lo stampa...fin qui tutto ok...ma quando il processo padre lo stampa il valore non quello incrementato! come se la modifca fatta dal processo figlio sia "locale" come possibile? dato che l'indirizzo di memoria della variabile che stampo lo stesso?


processo 2:0xbffff9a0 = 0
processo 1:0xbffff9a0 = 5


la domanda : io voglio che l'output di processo 1 e 2 siano uguali...come faccio?

marco_c
05-11-2004, 13:03
ovvio che ogni per ogni processo il valore di i cambia.
il fatto che l'indirizzo della base della memoria dove il processo risiede nella memoria di sistema (cio il tuo programma) sia uguale non c'entra.
nel momento in cui crei due processi le variabili come se si sdoppiassero

Loading