如果您要使用一些外部程式建立的訊號量,您可以嘗試以下程式碼(C 範例)
#define SVSEM_MODE (SEM_R | SEM_A | SEM_R>>3 | SEM_R>>6) /* 0644 */
#define PHP_SEM_NEED_NUMBER 3
/*.......*/
int semid, semflag = SVSEM_MODE | IPC_CREAT | IPC_EXCL;
struct sembuf semptr;
union semun semopts;
/*.......*/
if( (semid = semget(sempath, PHP_SEM_NEED_NUMBER, semflag)) >= 0 ) {
semopts.val = 1; /* 訊號燈的初始值 */
if( semctl( semid, 0, SETVAL, semopts) < 0 ) {/*錯誤*/}
if( semctl( semid, 1, SETVAL, semopts) < 0 ) {/*錯誤*/}
/* PHP 希望將第三個訊號燈的值設為 0,用於其自身的 semget。
* 請參考 ./PHP_SOURCE_PATH/ext/sysvsem/sysvsem.c */
*/
semopts.val = 0;
if( semctl( semid, 2, SETVAL, semopts) < 0 ) {/*錯誤*/}
}
else if(errno == EEXIST) { /* 僅連接 */
if( (semid = semget(sempath, PHP_SEM_NEED_NUMBER, SVSEM_MODE | IPC_CREAT)) < 0 ) {/*錯誤*/}
}
else {/*錯誤*/}
/*.......*/
/* 如果您想要取得訊號燈 */
semptr.sem_num = 0;
semptr.sem_op = -1; /* 鎖定 */
semptr.sem_flg = SEM_UNDO;
while( semop(semid, &semptr, 1) < 0 ) {/*錯誤*/}
/*.......*/
感謝,
Roma