0

このファイルをコンパイルして、1 つのコンソールで実行します。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
                /* l_type   l_whence  l_start  l_len  l_pid   */
    struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
    int fd;

    fl.l_pid = getpid();

    if (argc > 1) 
        fl.l_type = F_RDLCK;

    if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
        perror("open");
        exit(1);
    }

    printf("Press <RETURN> to try to get lock: ");
    getchar();
    printf("Trying to get lock...");

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

    printf("got lock\n");
    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;
}

以下を出力します。

ZJ:~/Documents/c$ ./a.out
press <RETURN> to try to get lock: 
Trying to get lock...got lock
press <RETURN> to release lock:

別のコンソールを開いて、vi lockdemo.c を開き、lockdemo.c を正常に変更しました。なんで?このファイルはロックされていませんか? 別のコンソールを開いている間

ZJ:~/Documents/c$ ./a.out
press <RETURN> to try to get lock: 

a.out は常に getchar() を実行しており、printf("Trying to get lock..."); を実行することさえできません。私は完全に混乱しています。

4

1 に答える 1

3

ファイルにアドバイザリロックを適用していlockdemo.cます。vi設計上、自由に無視できます。AFAIKがUnixで標準化されていない強制ロックを使用して、viそれを行わないようにする必要がありました。

于 2013-08-10T08:30:38.113 に答える