1
我有一個與CPP應用程序共享內存的PHP代碼,PHP是生產者,CPP是消費者。 我有事情的工作,但我發現有時代碼混亂,並且不能正常工作,因爲我研究了一點我發現PHP信號量實際上是一個3信號量對象,所以這可能是問題在這裏。 我需要一種方法來在兩個代碼之間進行互斥並避免這些類型的問題。PHP信號量與Ubuntu中的CPP應用程序兼容
這裏是我的PHP代碼的例子:
if (!$sem_id = sem_get($sem_key)) {
echo "Could not get ID for the semaphore.\n";
} else {
if (!sem_acquire($sem_id)) {
echo "failed.\n";
} else {
//echo "Sem ID: " . $sem_id . "<br/>";
if ($shm = shmop_open($shm_key, "c", 0666, 1048576)) {
$count = unpack('L', shmop_read($shm, 0, 4));
$count = reset($count);
$count++;
shmop_write($shm, pack('L', $count), 0);
shmop_write($shm, pack('L', $section_id) . $data, 4 + ($count-1) * 30);
} else {
echo "Couldnt't open shmop.";
}
sem_release($sem_id);
}
}
而對於CPP應用程序,我用這個功能,我發現:
static int semaphore1_get_access(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1; /* P() */
sem_b.sem_flg = SEM_UNDO;
if (semop(semaphore1_id, &sem_b, 1) == -1) //Wait until free
{
fprintf(stderr, "semaphore1_get_access failed\n");
return(0);
}
return(1);
}
static int semaphore1_release_access(void)
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1; /* V() */
sem_b.sem_flg = SEM_UNDO;
if (semop(semaphore1_id, &sem_b, 1) == -1)
{
fprintf(stderr, "semaphore1_release_access failed\n");
return(0);
}
return(1);
}
正如我說,我認爲這裏的問題是PHP處理Semaphores的方式,如果有人知道如何將這些函數調整爲與PHP兼容,我真的很感激它。
謝謝大家的幫助!