2012-02-26 15 views
2

競合状態を避けるためにシステムロックを使用したいと考えています。 1つのプロセスは、キャプチャされたイメージを.jpgファイルに保存するopencvプログラムです。もう1つのプロセスは、サーバーから同じイメージファイルを取得するブラウザです。私はこれら2つのプロセスの競合状態を避けたい。フロック機能を使っていますか?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コードは、少なくとも正しいプロトコルに従っているようです - 共有ファイルを書き出してロックを解除する前に排他的なロックを取得していますが、コード全体が何をしようとしているのか理解できません。あなたのコードが正しいことをしているかどうかを理解することは困難です。