0

私はubuntuマシンで次のcコードを実行しました...ファイルをロックするためのfcntl()の使用について読みましたが、F_WRLCKオプトンが設定されている場合は読み取ることさえできません...したがって、このプログラムを開始し、放棄する前にEnterキーを押してロックすると、2つの方法でファイルを開こうとしました。file1.cppを直接ダブルクリックする方法と、新しいターミナルで別のcプログラムを実行する方法です。 fcntl()は、F_WRLCKが設定されているときにこれらのファイルを開くことを許可します。

int main(int argc, char *argv[])
{

struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
int fd;

fl.l_pid = getpid();

if ((fd = open("/home/file1.cpp", O_WRONLY)) == -1)
{
    perror("open");
    exit(1);
}


if (fcntl(fd, F_SETLKW, &fl) == -1) 
{
    perror("fcntl");
    exit(1);
}


printf("Press <RETURN> to release lock: ");
getchar();

fl.l_type = F_UNLCK;  /* set to unlock same region */

if (fcntl(fd, F_SETLK, &fl) == -1)
{
    perror("fcntl");
    exit(1);
}

printf("Unlocked.\n");

close(fd);

return 0;
}
4

1 に答える 1

0

fcntlロックは純粋にアドバイザリ ロックです。それらの唯一の効果はfcntl F_SETLK、ロックを取得できない場合に呼び出しをブロックすることです。IO 操作にはまったく影響しません。同期が必要な場合、IO を実行する前に必要なロックを取得するのはプログラム次第です。

これは、ミューテックスを使用してメモリ内のオブジェクトを保護することに完全に似ています。ミューテックスは、メモリアドレスの読み取りまたは書き込みを妨げません。これは、プログラムが適切な時間だけ読み取りと書き込みを行うようにするために使用するプロトコルにすぎません。

于 2012-06-16T11:15:47.123 に答える