Toon posts:

[linux]file locks

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben me aan het verdiepen in het lock-en van files (specifiek /dev/ttyS0, ....) zodat slechts 1 programma gebruik kan maken van een com-poort.
Ik heb wat info gevonden en wil dit nu implementeren in C.
Eens even gekeken wat minicom doet, en die maakt drie files aan:
LCK.004.064
LCK...17640
LCK..ttyS0
Ik heb nog geen info kunnen vinden waarom er 3 files zijn. Moet ik ook 3 files creeeren? De laatste twee spreken min of meer voor zich (pid en com-port), maar de eerste is een vraagteken (major/minor number?)

Kan iemand een tipje van de sluier oplichten tav de samenhang van deze 3 files, bij voorkeur een linkje van waaruit ik verder kan werken.

Voordat ik bovenstaande link vond, heb ik al wat geprobeerd met fcntl() (lijkt niks te doen; voorbeeld gewaardeerd) en flock() (werkt wel, maar geeft geen melding als je een tweede keer toegang aanvraagt). Twijfekl nu echter of dat de juiste weg is.

PS: Antwoorden worden waarschijnlijk pas na het weekend gelezen.

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

flock() is een advisory lock, hetgeen betekend dat applicaties ook flock() moeten gebruiken wil het zowiezo werken, en dat de kernel ook niet tegenhoud dat er twee applicaties hetzelfde willen locken.
de LCK zijn een soort standaard die minicom en bv hylafax gebruiken, maar ook dat vereist dus support van applicaties.

fcntl() is zowel advisory als mandatory, afhankelijk van het OS (Op Linux vereist het oa een mount optie, op Solaris is het mandatory).

Gebruik van fcntl, beiden in een aparte terminal openen (en binnen 10 seconde) :

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
    int fd;
    struct flock lck;

    fprintf(stderr, "Hi, I'm %d\n", getpid());
    
    fd = open("/dev/ttyS1", O_RDWR);
    if (fd == -1) {
        perror("open");
        _exit(1);
    }

    while (1) {
        memset(&lck, 0, sizeof(lck));
        if (fcntl(fd, F_GETLK, &lck) == -1) {
            perror("fcntl");
        }

        if (lck.l_pid == 0)
            break;
        else {
            printf("Locked !!!! by pid %d\n", lck.l_pid);
            sleep(1);
        }
    }
            
    lck.l_type = F_WRLCK;
    lck.l_whence = SEEK_CUR;
    lck.l_start = 0;
    lck.l_len = 0;

    if (fcntl(fd, F_SETLKW, &lck) == -1) {
        perror("fcntl");
        close(fd);
        _exit(1);
    }

    sleep(10);

    lck.l_type = F_UNLCK;
    lck.l_whence = SEEK_CUR;
    lck.l_start = 0;
    lck.l_len = 0;

    
    if (fcntl(fd, F_SETLKW, &lck) == -1) {
        perror("fcntl");
        close(fd);
        _exit(1);
    }

    fprintf(stderr, "OK\n");
    close(fd);

    return 0;
}