2014-03-25 37 views
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兼容,我真的很感激它。

謝謝大家的幫助!

回答

0

那麼,嘗試了很多東西后。 這種方式似乎已經解決了這一問題:

static int semaphore1_get_access(int num) 
{ 

    struct sembuf sops[3]; //struct sembuf *sops = (struct sembuf *) malloc(3*sizeof(struct sembuf)); 

    sops[0].sem_num = 0; 
    sops[0].sem_op = -1; /* P() */ 
    sops[0].sem_flg = SEM_UNDO; 
    sops[1].sem_num = 1; 
    sops[1].sem_op = 1; /* P() */ 
    sops[1].sem_flg = SEM_UNDO; 


    if (semop(semaphore1_id, sops, 2) == -1)  //Wait until free 
    { 
     fprintf(stderr, "semaphore1_get_access failed\n"); 
     return(0); 
    } 

    return(1); 

} 

static int semaphore1_release_access(int num) 
{ 
    struct sembuf sops[3];// = (struct sembuf *) malloc(3*sizeof(struct sembuf)); 

    sops[0].sem_num = 0; 
    sops[0].sem_op = 1; /* P() */ 
    sops[0].sem_flg = SEM_UNDO; 
    sops[1].sem_num = 1; 
    sops[1].sem_op = -1; /* P() */ 
    sops[1].sem_flg = SEM_UNDO; 

    if (semop(semaphore1_id, sops, 2) == -1)  //Wait until free 
    { 
     fprintf(stderr, "semaphore1_get_access failed\n"); 
     return(0); 
    } 



return(1); 
} 

我不這樣做使用第三旗語,但我不知道這是否可能有consecuenses。

我發現關於PHP處理信號燈的方式這​​樣的信息: http://www.serverphorums.com/read.php?8,313695

我發現有用的是, 從組3的第一個信號是真實的,阻塞過程與否, 的第二個用於瞭解有多少進程正在訪問信號量 第三個用於控制對第二個信號量的訪問。