我想使用系统锁来避免竞争条件。一个过程是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调用。
发布于 2012-02-28 01:56:10
flock(2)阻塞,如果您请求独占锁,但它不可用。当一切正常时,它将返回0;如果出现错误,它将返回-1,然后可以使用perror(3)或errno变量进行检查。
看起来,您的C代码至少模糊地遵循了正确的协议--在编写共享文件之前获得共享文件的独占锁,然后将其解锁--但是我不能理解您的代码总体上想要做什么,因此很难理解您的代码是否在做正确的事情。
https://stackoverflow.com/questions/9452715
复制相似问题