\n";
$fl_name = './flock.dat';
if(($fn = fopen($fl_name,'c+'))===false) exit('open error');
flock($fn, LOCK_EX,$rc);
echo "flock rc = $rc
\n";
$pid = pcntl_fork();
if ($pid == -1){
exit("error pcntl_fork");
}else
if ($pid == 0){
// 子プロセス
sleep(1);
if(($fn2=fopen($fl_name,'r+'))===false) exit('open error');
if(flock($fn2,LOCK_EX | LOCK_NB,$rc)===false){
echo "ko lock2 error $rc
\n";
}else{
echo "ko lock2 success $rc
\n";
}
fclose($fn2);
exit(0); // これで、子は$fnをクローズする。
}
// 子プロセス終了前のロック状態
if(($fn2=fopen($fl_name,'r+'))===false) exit('open error');
if(flock($fn2,LOCK_EX | LOCK_NB,$rc)===false){
echo "lock2 error $rc
\n";
}else{
echo "lock2 success $rc
\n";
}
fclose($fn2);
sleep(3);
// 子プロセス終了後のロック状態
if(($fn2=fopen($fl_name,'r+'))===false) exit('open error');
if(flock($fn2,LOCK_EX | LOCK_NB,$rc)===false){
echo "lock2 error2 $rc
\n";
}else{
echo "lock2 success2 $rc
\n";
}
fclose($fn2);
fclose($fn);
// 上のfclose($fn)でロック解除されているか?
if(($fn2=fopen($fl_name,'r+'))===false) exit('open error');
if(flock($fn2,LOCK_EX | LOCK_NB,$rc)===false){
echo "lock2 error3 $rc
\n";
}else{
echo "lock2 success3 $rc
\n";
}
fclose($fn2);
?>