(root)/
glibc-2.38/
manual/
examples/
ofdlocks.c
       1  /* Open File Description Locks Usage Example
       2     Copyright (C) 1991-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU General Public License
       6     as published by the Free Software Foundation; either version 2
       7     of the License, or (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program; if not, see <https://www.gnu.org/licenses/>.
      16  */
      17  
      18  #define _GNU_SOURCE
      19  #include <stdio.h>
      20  #include <sys/types.h>
      21  #include <sys/stat.h>
      22  #include <unistd.h>
      23  #include <fcntl.h>
      24  #include <pthread.h>
      25  
      26  #define FILENAME	"/tmp/foo"
      27  #define NUM_THREADS	3
      28  #define ITERATIONS	5
      29  
      30  void *
      31  thread_start (void *arg)
      32  {
      33    int i, fd, len;
      34    long tid = (long) arg;
      35    char buf[256];
      36    struct flock lck = {
      37      .l_whence = SEEK_SET,
      38      .l_start = 0,
      39      .l_len = 1,
      40    };
      41  
      42    fd = open ("/tmp/foo", O_RDWR | O_CREAT, 0666);
      43  
      44    for (i = 0; i < ITERATIONS; i++)
      45      {
      46        lck.l_type = F_WRLCK;
      47        fcntl (fd, F_OFD_SETLKW, &lck);
      48  
      49        len = sprintf (buf, "%d: tid=%ld fd=%d\n", i, tid, fd);
      50  
      51        lseek (fd, 0, SEEK_END);
      52        write (fd, buf, len);
      53        fsync (fd);
      54  
      55        lck.l_type = F_UNLCK;
      56        fcntl (fd, F_OFD_SETLK, &lck);
      57  
      58        /* sleep to ensure lock is yielded to another thread */
      59        usleep (1);
      60      }
      61    pthread_exit (NULL);
      62  }
      63  
      64  int
      65  main (int argc, char **argv)
      66  {
      67    long i;
      68    pthread_t threads[NUM_THREADS];
      69  
      70    truncate (FILENAME, 0);
      71  
      72    for (i = 0; i < NUM_THREADS; i++)
      73      pthread_create (&threads[i], NULL, thread_start, (void *) i);
      74  
      75    pthread_exit (NULL);
      76    return 0;
      77  }