2012-02-26 11 views
2

我想使用系統鎖來避免競爭條件。一個進程是一個opencv程序,將捕獲的圖像保存爲.jpg文件。另一個過程是瀏覽器從服務器獲取相同的圖像文件。我想避免這兩個過程之間的競爭狀態。我使用羊羣功能嗎?如何使用flock()

我OpenCV的代碼是:

#include<sys/file.h> 
#include<fcntl.h> 
#include<string.h> 
#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 

int main() 
{ 
    int fd1,fd2; 
    struct flock lock; 
    fd1=open("a1.jpg",O_WRONLY); 
    fd2=open("a2.jpg",O_WRONLY); 
    lock.l_type=F_UNLCK; 
    fcntl(fd1,F_SETLKW,&lock); 

    CvCapture* capture = cvCaptureFromCAM(-1); 
    if (!capture) 
    { 

      fprintf(stderr, "ERROR: capture is NULL \n"); 
      getchar(); 
      return -1; 
    } 

    cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE); 
    while (1) 
    { 
      IplImage* frame = cvQueryFrame(capture); 
      if (!frame) 

        fprintf(stderr, "ERROR: frame is null...\n"); 
        getchar(); 
        break; 
      } 
      cvShowImage("mywindow", frame); 
      if(flock(fd1,LOCK_EX)==0) 
      { 
      printf("A1 is locked"); 
      cvSaveImage("a1.jpg",frame,0); 
      flock(fd1,LOCK_UN); 
      printf("A1 unlocked"); 
      } 
      else 
      { 
      flock(fd2,LOCK_EX); 
      cvSaveImage("a2.jpg",frame,0); 
      flock(fd2,LOCK_UN); 
      printf("A2 is unlocked"); 
      } 
      if ((cvWaitKey(500) & 255) == 27) 
        break; 
    } 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("mywindow"); 
    close(fd1); 
    close(fd2); 
    return 0; 

} 

我的PHP文件是

<?php 
$dest='a.jpg'; 
$src1='a1.jpg'; 
$src2='a2.jpg'; 
if(flock($fp1,LOCK_EX)) 
{ 
    echo "a1"; 
    $img=imagecreatefromjpeg($src1); 
    $copy=imagejpeg($img,$dest); 
    imagedestroy($img); 
    flock($fp1,LOCK_UN); 
} 
else 
{ 
    echo "A2"; 
    flock($fp2,LOCK_EX); 
    $img=imagecreatefromjpeg($src2); 
    $copy=imagejpeg($img,$dest); 
    imagedestroy($img); 

    flock($fp2,LOCK_UN); 
} 
?> 

這個PHP是使用AJAX客戶端調用。

+0

從哪種意義上說,您對使用的正確性不確定?你測試了你的代碼,並得到有線結果嗎?你能詳細說一下嗎? – hakre 2012-02-26 11:38:57

+0

如果雞羣成功,它應該返回0,但它不返回任何值。另外,當我嘗試通過一些其他進程訪問文件時,我可以訪問它。所以這意味着我沒有獲得該文件的鎖定。 – user927774 2012-02-26 11:43:06

+0

這是C部分還是PHP部分? http://php.net/flock – hakre 2012-02-26 11:49:01

回答

0

flock(2)塊如果您要求獨佔鎖並且不可用。當所有行爲都正常時它會返回0 - 如果有錯誤,它將返回-1,然後您可以使用perror(3)或errno變量進行檢查。

看來你的C代碼至少隱約遵循正確的協議 - 在寫入共享文件之前獲得對共享文件的獨佔鎖定,然後解鎖它 - 但我不明白你的代碼試圖做什麼,所以很難理解你的代碼是否做得正確。

相關問題