2012-02-26 10 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代码至少隐约遵循正确的协议 - 在写入共享文件之前获得对共享文件的独占锁定,然后解锁它 - 但我不明白你的代码试图做什么,所以很难理解你的代码是否做得正确。

相关问题