2012-02-26 2 views
2

경쟁 조건을 피하기 위해 시스템 잠금을 사용하고 싶습니다. 하나의 프로세스는 캡처 한 이미지를 .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의 코드입니다.

+0

어떤 의미에서 사용법의 정확성에 대해 확신하지 못합니까? 코드를 테스트하고 유선 결과를 얻었습니까? 좀 더 정교 해 주실 수 있습니까? – hakre

+0

flock가 성공하면 0을 반환하고, 아무 값도 반환하지 않습니다. 또한 내가 다른 일부 프로세스에 의해 파일에 액세스하려고하면 액세스 할 수 있습니다. 그래서 그 파일을 잠그고 있지 않다는 뜻입니다. – user927774

+0

C 부분이나 PHP 부분 안에 있습니까? http://php.net/flock – hakre

답변

0

독점적 잠금을 요청하고 사용할 수없는 경우 flock (2) 블록. 모두 정상적으로 동작하면 0을 반환합니다. 오류가 있으면 -1을 반환하고 perror (3) 또는 errno 변수를 사용하여 검사 할 수 있습니다.

C 코드는 최소한 올바른 프로토콜을 따르는 것으로 보입니다. 공유 파일을 쓰고 잠금을 해제하기 전에 독점적으로 잠글 수는 있지만 코드가 전반적으로하는 일을 이해할 수는 없지만, 따라서 코드가 올바른 일을하는지 여부를 이해하는 것은 어렵습니다.