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客户端调用。
从哪种意义上说,您对使用的正确性不确定?你测试了你的代码,并得到有线结果吗?你能详细说一下吗? – hakre 2012-02-26 11:38:57
如果鸡群成功,它应该返回0,但它不返回任何值。另外,当我尝试通过一些其他进程访问文件时,我可以访问它。所以这意味着我没有获得该文件的锁定。 – user927774 2012-02-26 11:43:06
这是C部分还是PHP部分? http://php.net/flock – hakre 2012-02-26 11:49:01