echo
"parent progress pid:{$parentPid}\n"
;
$childList
=
array
();
$shm_id
=
ftok
(
__FILE__
,
'm'
);
$sem_id
=
ftok
(
__FILE__
,
's'
);
$shareMemory
= shm_attach(
$shm_id
);
$signal
= sem_get(
$sem_id
);
const
SHARE_KEY = 1;
function
producer(){
global
$shareMemory
;
global
$signal
;
$pid
= posix_getpid();
$repeatNum
= 5;
for
(
$i
= 1;
$i
<=
$repeatNum
;
$i
++) {
sem_acquire(
$signal
);
if
(shm_has_var(
$shareMemory
,SHARE_KEY)){
$count
= shm_get_var(
$shareMemory
,SHARE_KEY);
$count
++;
shm_put_var(
$shareMemory
,SHARE_KEY,
$count
);
echo
"({$pid}) count: {$count}\n"
;
}
else
{
shm_put_var(
$shareMemory
,SHARE_KEY,0);
echo
"({$pid}) count: 0\n"
;
}
sem_release(
$signal
);
$rand
= rand(1,3);
sleep(
$rand
);
}
}
function
createProgress(
$callback
){
$pid
= pcntl_fork();
if
(
$pid
== -1) {
exit
(
"fork progress error!\n"
);
}
else
if
(
$pid
== 0) {
$pid
= posix_getpid();
$callback
();
exit
(
"({$pid})child progress end!\n"
);
}
else
{
return
$pid
;
}
}
for
(
$i
= 0;
$i
< 3;
$i
++ ) {
$pid
= createProgress(
'producer'
);
$childList
[
$pid
] = 1;
echo
"create producer child progress: {$pid} \n"
;
}
while
(!
empty
(
$childList
)){
$childPid
= pcntl_wait(
$status
);
if
(
$childPid
> 0){
unset(
$childList
[
$childPid
]);
}
}
shm_remove(
$shareMemory
);
sem_remove(
$signal
);
echo
"({$parentPid})main progress end!\n"
;