경쟁 조건을 피하기 위해 시스템 잠금을 사용하고 싶습니다. 하나의 프로세스는 캡처 한 이미지를 .jpg 파일에 저장하는 opencv 프로그램입니다. 다른 프로세스는 서버에서 동일한 이미지 파일을 가져 오는 브라우저입니다. 이 두 프로세스 간의 경쟁 조건을 피하고 싶습니다. 무리 기능을 사용하고 있습니까?flock() 사용 방법
#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는 AJAX를 사용하여 클라이언트 측에서 호출
<?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);
}
?>
입니다 :
내 OpenCV의 코드입니다.
어떤 의미에서 사용법의 정확성에 대해 확신하지 못합니까? 코드를 테스트하고 유선 결과를 얻었습니까? 좀 더 정교 해 주실 수 있습니까? – hakre
flock가 성공하면 0을 반환하고, 아무 값도 반환하지 않습니다. 또한 내가 다른 일부 프로세스에 의해 파일에 액세스하려고하면 액세스 할 수 있습니다. 그래서 그 파일을 잠그고 있지 않다는 뜻입니다. – user927774
C 부분이나 PHP 부분 안에 있습니까? http://php.net/flock – hakre