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