Newsgroup: it.comp.os.linux.sys
Titolo: [semiOT] php non forka bene su .. ??

so di essere OT, ma se posto qua è perchè confido nella vostra
conoscenza del sistema operativo, perchè questa cosa è davvero strana.
problema: devo fare uno script php che forka e fa fare ai figli(tanti)
una determinata operazione (la stessa, ma su target diversi)
le funzioni che mi servono sono quindi le pcntl_fork/wait/waitpid/signal
eccetera.
Fatto un primo programmino di test per vederne il funzionamento mi sono
trovato in una situazione che proprio non riesco a capire:
alcune volte succede che la wait del padre non riesce a catturare per bene
i pid dei figli morti ( torna -1 al posto del pid), in particolar modo
questo accade quando:
1)- i figli sono già morti quando il padre si mette in wait
2)- 2 o più figli muoio "quasi" contemporaneamente
Ecco,questo è il problema.
Ma la cosa curiosa è che questo succede solo se il programma gira su
determinati ambienti!
queste sono le prove fatte da me:
slackware 12 , kernel 2.6.21 , php 5.2.qualcosa => il problema c'è.
slackware 11 , kernel 2.6.17 , php 4.3.10 => il problema c'è.
slackware 10.2 , kernel 2.6.13 , php 4.4.0 => il problema c'è.
debian etch kernel 2.6.18,  php 5.2.0 => il problema NON c'è
ubuntu QUALCOSA kernel 2.6.20 , php 5.2.1 => il problema NON c'è
ecco queste sono le distro che avevo a disposizione per fare le prove, e
sembrerebbe che il problema dipenda dalla DISTRO e non dalle versioni del
software! bah mi sembra incredibile pero' non so dove andare a parare ,
forse in slackware non vengono spuntate di default determinate opzioni del
kernel? (non credo perchè altrimenti avrei problemi sulle fork in
generale, mentre lo stesso programma fatto in C o python funziona
perfettamente)
Non so veramente a quale santo rivolgermi per capire cosa succede. 
Riporto anche lo script,, se avete voglia di provarlo su una qualche
distro diversa da quelle che ho elencato magari viene fuori qualcosa.
Grazie in anticipo:
ah, commentare/decommentare la sleep sul figlio fa in modo di passare
dalla situazione 1) alla 2) descritte sopra
#!/usr/bin/php
<?php
$children = array(); 
function child($id)
{
	$p=posix_getpid();
	echo "child: ($id) pid ($p)\n";
	//sleep(rand(1,5));
	echo "child:end pid ($p)\n";
	exit(0);
}
$i=0;
while($i<10)
{
	$pid = pcntl_fork();
	if($pid == -1)
		die("Could not fork!");
	elseif($pid == 0)
		 child($i);
	else
	{
		$children[$pid] = $i;
		$i++;	
	}	
}
print "dad:sleep a bit...\n";
$i=10;
while($i)
{
	$pid_dead = pcntl_waitpid(-1,$status);
	echo "dad:dead child pid ($pid_dead) \n";
	if(isset($children[$pid_dead]))
		unset($children[$pid_dead]);
 
	$i--;
}
echo "\ndad: Figli non correttamente aspettati:\n";
print_r($children);			
?>

 1)- i figli sono già morti quando il padre si mette in wait
Il timeout dell'esecuzione degli script PHP?
Cioè il parametro, in php.ini:
max_execution_time = 30
di default a 30 secondi?
Così, come idea...

 di default a 30 secondi?
impossibile, lo script dura dagli 1 ai 5 secondi (dipendentemente dal
fatto di tenere o meno commentata quella sleep)
anche io ho pensato a qualche impostazione di php.ini, ne ho copiato uno
da una distro dove lo script girava bene,cambiato nulla :( 

RedWiz ha scritto:

Che libc hai sulle varie versioni? sull'ultima slack che ho installato c'è 
la 2.5, se vado di slapt-get arrivo alla 2.7
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
"A power so great, it can only be used for Good or Evil!"
		-- Firesign Theatre, "The Giant Rat of Summatra"

 una determinata operazione (la stessa, ma su target diversi)
Aspetta: stai usando php come standalone o come modulo di apache?
bye!

 Aspetta: stai usando php come standalone o come modulo di apache?
standalone