2

競合状態を回避するためにシステム ロックを使用したいと考えています。1 つのプロセスは、キャプチャした画像を .jpg ファイルに保存する opencv プログラムです。もう 1 つのプロセスは、サーバーから同じ画像ファイルを取得するブラウザです。これら 2 つのプロセス間の競合状態を回避したい。私は群れ機能を正しく使用していますか?

私の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 を使用してクライアント側から呼び出されます。

4

1 に答える 1

0

flock(2)は、排他ロックを要求していて使用できない場合にブロックします。すべてが正常に動作している場合は0を返します。エラーがある場合は-1を返します。エラーがある場合は、perror(3)またはerrno変数を使用して調べることができます。

あなたのCコードは少なくとも漠然と正しいプロトコルに従っているようです-それを書く前に共有ファイルの排他的ロックを取得してからそれをロック解除します-しかし私はあなたのコードが全体的に何をしようとしているのか理解できないので難しいですコードが正しいことをしているかどうかを理解するため。

于 2012-02-27T17:56:09.570 に答える