Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-05-2008, 11:56   #1
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
[unix c#] processi figli

ciao raga

dovrei creare 2 processi figli dallo stesso padre utilizzando la funzione fork

se faccio

pid_t figlio1, figlio2;

figlio1 = fork();
figlio2 = fork();

me li crea ma mi crea anche due padri diversi guardando il pid con getpid()

come posso risolvere?

Ultima modifica di *MATRIX* : 15-05-2008 alle 15:52.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2008, 13:05   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Questo è codice C#?

Be' se prima non controlli di essere il padre, quella seconda fork() la fa anche il processo figlio, o sbaglio?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2008, 17:27   #3
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
come si fa a controllare di avere un solo padre?
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2008, 18:15   #4
..::DAVE::..
Senior Member
 
L'Avatar di ..::DAVE::..
 
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
if(figlio1==0)
{//sei nel figlio
}
else
{//sei nel padre
}
..::DAVE::.. è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2008, 18:20   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
No, aspetta, ricapitoliamo come funziona la fork(): la chiami e leggi il valore di ritorno, a quel punto dovrai capire 1) se l'operazione è andata a buon fine, nel qual caso devi anche controllare 2) se il tuo processo attuale è il processo padre o se è il figlio.

Quindi, una cosa tipo:
Codice:
pid_t nProcessID = fork();

switch (nProcessID)
{
  case -1:
    /* errore */
    exit(EXIT_FAILURE);

  case 0:
    /* processo figlio */
    break;

  default:
    /* processo padre */
    break;
}
Questi controlli li puoi fare ovviamente anche con degli if, che forse ti saranno più comodi per altre cose.
In poche parole, una volta sdoppiato il processo padre, puoi fare una seconda fork() come padre per avere due figli (o come figlio, perché abbia a sua volta un processo figlio).

Scusa la curiosità, ma perché devi fare due fork() in quel modo?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2008, 21:16   #6
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
a che mi serve? per esercitarmi nelle fork è un pezzettino di un maxi esercizio

cmq non ho capito nulla su come creare due figli da un solo processo padre


io già avevo creato un processo

facendo così ho uno figlio e uno padre

io ho bisogno di due figlii dello stesso padre

se faccio una seconda fork avrò un altro padre

come risolvere?

int main()
{
figlio = fork();

if (figlio==0)
{
printf("PROCESSO FIGLIO 1 ");
printf(" PID figlio1 %d\n",getpid());
}

else if (figlio>0)
{

printf("processo padre ");
printf("PID padre 1 %d\n",getpid());
}

Ultima modifica di *MATRIX* : 11-05-2008 alle 21:22.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2008, 22:08   #7
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Prova questo, un po' di ricorsione e puoi creare N_MASSIMO figli:
Codice:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define N_MASSIMO 2
void CreaFigli(unsigned int);

int main()
{
	CreaFigli(0);
	return EXIT_SUCCESS;
}

void CreaFigli(unsigned int uCount)
{
	pid_t nProcessID;

	if (uCount >= N_MASSIMO) {
		return;
	}

	++uCount;
	nProcessID = fork();
	if (nProcessID == -1) {
		fprintf(stderr, "ERRORE! Numero di figli precedentemente creati: %u.\n", uCount);
		exit(EXIT_FAILURE);
	}

	/* Se sono nel processo padre */
	if (nProcessID > 0) {
		printf(" [!!] Mio figlio ha l'ID %d.\n", nProcessID);

		CreaFigli(uCount);

		waitpid(nProcessID, NULL, 0);
	}
	/* Se sono nel processo figlio */
	else {
		printf(" -> Sono il figlio numero %u.\n", uCount);
	}
}
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2008, 15:39   #8
arara
Senior Member
 
L'Avatar di arara
 
Iscritto dal: Aug 2007
Messaggi: 1270
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
cmq non ho capito nulla su come creare due figli da un solo processo padre

Codice:
// Qua sei nel parent.

// Crei il primo child:
if ( fork()==0 ) {
  // Qua sei nel primo child, esegui il suo codice
  codiceFiglio1();

  // Quando il child finisce, esci.
  return;
}

// Qua il parent continua ad andare avanti per conto suo.
// Questo codice non viene eseguito dal primo child, a causa del return.

// Creo il secondo child:
if ( fork()==0 ) {
  // Come prima...
  codiceFiglio2();
  return;
}

// Qua sei sempre nello stesso parent di prima...
arara è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2008, 20:17   #9
Piojolopez2406
Senior Member
 
L'Avatar di Piojolopez2406
 
Iscritto dal: Jan 2005
Città: NAPOLI
Messaggi: 648
guarda il discorso è molto piu semplice di quanto pare, per creare 2 figli dello stesso padre devi fare in questa maniera:

int main ()
{

pid_t pid1,pid2;

if ((pid1=fork())==0)
{
//qui entri se la creazione del primo figlio va a buon fine
}
if((pid2=fork())==0)
{
//qui entri se la creazione del seconod figlio va a buon fine
}
//e qui c'è il codice del padre
}


te lo scritto in maniera molto semplice ma eventualmente potresti mettere degli ulteriori if per controllare qualora la creazione dei figli non andasse a buon fine.
Ma cmq il succo della questione è che facendo le 2 fork una immediatamente dopo l'altra praticametne è come se creassi un terzo figlio.
__________________
O'Napule dint'o'core..........
-MacBook 2,26 GHz Intel Core 2 Duo - 4 GB DDR3
-IPhone 3GS 16 GB
-Ipad wifi+3g 64gb
Piojolopez2406 è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:13   #10
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
si però se volessi crare 50 processi devo dichiarare 50 pid?

con il for come si potrebbe fare tenendo presente che ogni processo fa una cosa diversa?
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:23   #11
arara
Senior Member
 
L'Avatar di arara
 
Iscritto dal: Aug 2007
Messaggi: 1270
Se devi far eseguire delle operazioni diverse a ognuno dei 50 child ti conviene mettere il codice che fa la fork dentro a una funzione e richiamarla passandoli come argomento la funzione col codice da far eseguire, tipo cosi:

createNewChild(&pid1, function1);
createNewChild(&pid2, function2);
createNewChild(&pid3, function3);
...
arara è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:31   #12
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
Quote:
Originariamente inviato da arara Guarda i messaggi
Se devi far eseguire delle operazioni diverse a ognuno dei 50 child ti conviene mettere il codice che fa la fork dentro a una funzione e richiamarla passandoli come argomento la funzione col codice da far eseguire, tipo cosi:

createNewChild(&pid1, function1);
createNewChild(&pid2, function2);
createNewChild(&pid3, function3);
...
però dovrei dichiarare da pid1 a pid50

quindi poi chiamare delle sottofunzioni per ogni pid
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:44   #13
arara
Senior Member
 
L'Avatar di arara
 
Iscritto dal: Aug 2007
Messaggi: 1270
potresti fare una cosa de genere:

Codice:
//esempi di funzioni da far eseguire ai child:
void print() { ... }
void clear() { ... }
void reset() { ... }
void start() { ... }
void stop() { ... }

int createNewChild( void (*function)(void) ) {
  pid == fork();
  if (pid) {
    // se è il child esegue la funzione.
    function();
  }
  // se è il parent esce senza far niente e va avanti con gli altri.
  return pid;
}

int main() {
  createNewChild( print );
  createNewChild( clear );
  createNewChild( reset );
  createNewChild( start );
  createNewChild( stop );
  ...
}
Se il pid non ti serve nel resto del programma puoi anche scartarlo, tanto la funzione si arrangia da sola.
arara è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:45   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
però dovrei dichiarare da pid1 a pid50
Non basta un'array con un contatore incrementato durante il ciclo?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:52   #15
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
nt createNewChild( ) {
pid == fork();
if (pid) {
printf(" PID CREZIONEfiglio 1 %d\n",getpid());
}
// se è il parent esce senza far niente e va avanti con gli altri.
return pid;
}

int main() {
createNewChild( );
createNewChild( );

}

dove sbaglio?

voglio creare due processi figli che mi visualizzano il loro pid
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 13:58   #16
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
Codice:
if (pid) {
Qui.
Lì la condizione è vera solo se pid non è 0, cioè se la fork() fallisce o se sei nel genitore.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 14:05   #17
arara
Senior Member
 
L'Avatar di arara
 
Iscritto dal: Aug 2007
Messaggi: 1270
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Qui.
Lì la condizione è vera solo se pid non è 0, cioè se la fork() fallisce o se sei nel genitore.
colpa mia che avevo scritto sta castroneria :

Codice:
int createNewChild( void (*function)(void) ) {
  pid == fork();
  if (pid) {
     ....
  }

cosi funziona:

Codice:
#include <stdio.h>
#include <stdlib.h>

//esempi di funzioni da far eseguire ai child:
void print() { printf("printing...\n"); }
void clear() { printf("clearing...\n"); }
void reset() { printf("resetting...\n"); }
void start() { printf("starting...\n"); }
void stop() { printf("stopping...\n"); }

int createNewChild( void (*function)(void) ) {
	int pid = fork();
	if (pid==0) {
		// se è il child esegue la funzione.
		function();
                // quando il child finisce deve terminare, seno va avanti e lancia a sua volta gli altri child...
		exit(0);
	}
	// se è il parent esce senza far niente e va avanti con gli altri.
	return pid;
}

int main() {
	createNewChild( print );
	createNewChild( clear );
	createNewChild( reset );
	createNewChild( start );
	createNewChild( stop );
	return;
}
arara è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2008, 14:29   #18
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
ok grazie adesso ho capito cosa fare con i processi
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
GTA 6 a 30 FPS su console e PSSR su PS5 ...
La scheda video AMD sta consumando il tu...
Sviluppatori contro XBOX Series S? Ecco ...
Adobe Acrobat sbarca su Google Workspace...
Google lancia il nuovo Pixel Tag e rivol...
Google DeepMind presenta AlphaGenome 2: ...
Questa e-bike da 26" su AliExpress costa...
Tre continenti, due oceani, zero scali: ...
Google Pixel 11 crolla a 629€ su Amazon,...
ByteDance prepara la risposta a Meta Mus...
Amazon taglia di circa 100€ il prezzo di...
Un eccellente treppiede in carbonio a ci...
DJI Osmo Action 5 Pro, super prezzo su A...
Terremoto NVIDIA: Jensen Huang rischia i...
Spopola su Amazon, giustamente: ECOVACS ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:13.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v