Block with fcntl


 
Thread Tools Search this Thread
Operating Systems Linux Block with fcntl
# 1  
Old 09-30-2013
Block with fcntl

Good evening, friends

I'm learning with a book: Programming Linux by Kurt Wall (Prentice Hall)

The code below could run in two windows (./lockit /tmp/foo in both for example). There is not problem with the read block (first byte) but when one, apply the write block while in the other is with the read block yet, the error message is:

block write already by -1075043608

and appear every time you press a key (instead of show the pid of the proccess)

But, even you running the program in a window only, happens the same.

I don't get to understand it.

Can you help to correct the code?

Thanks.


Code:
/*
 * lockit.c - Establece el bloqueo en un archivo
 */
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
/* Establece un bloqueo de tipo en el descriptor fd */
void setlock(int fd, int type);
int main ( int argc, char *argv[] )
{
  int fd;
  /* Abre el archivo */
  fd = open(argv[1], O_RDWR | O_CREAT, 0666);
  if (fd < 0) {
   perror("open");
   exit(EXIT_FAILURE);
  }
  /* Establece un bloqueo de lectura */
  setlock(fd, F_RDLCK);
  printf("PID %d bloqueado para lectura %s\n", getpid(), argv[1]);
  getchar();
  /* Desbloqueo */
  setlock(fd, F_UNLCK);
  printf("PID %d unlocked %s\n", getpid(), argv[1]);
  getchar();
  close(fd);
  /* Establece un bloqueo de escritura */
  setlock(fd, F_WRLCK);
  printf("PID %d bloqueado para escritura %s\n", getpid(), argv[1]);
 
  return EXIT_SUCCESS;
}    /* ----------  end of function main  ---------- */
void setlock(int fd, int type)
{
  struct flock lock;
  char msg[80];
  /* Describe el bloqueo que queremos */
  lock.l_whence = SEEK_SET;
  lock.l_start = 0;
  lock.l_len = 1; /* bloquea un solo bit */
  while (1) {
   lock.l_type = type;
   /* Bloqueo establecido y vuelta al que llama */
   if ((fcntl(fd, F_SETLK, &lock)) == 0)
    return;
   /* Busca por qué no podemos establecer el bloqueo */
   fcntl(fd, F_GETLK, &lock);
   if(lock.l_type != F_UNLCK) {
    switch(lock.l_type) {
     case(F_RDLCK):
      sprintf(msg, "bloqueo de lectura ya establecido por %d\n", lock.l_pid);
      break;
     case(F_WRLCK):
      sprintf(msg, "bloqueo de escritura ya establecido por %d\n", lock.l_pid);
      break;
    }
   }
   puts(msg);
   getchar();
  }
}

---------- Post updated at 11:42 PM ---------- Previous update was at 08:18 PM ----------

Sorry, i had an error.

Deleting line --> close(fd); into /* Desbloqueo */

Adding getchar(); close(fd) after printf("PID %d bloqueado para escritura %s\n", getpid(), argv[1]);

Sorry again.
This User Gave Thanks to joe_cosmo For This Post:
# 2  
Old 09-30-2013
Thanks for letting us know the fix.

I am closing this thread.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Add a block of code at the end of a specific block

I need to search for a block with the starting pattern say "tabId": "table_1", and ending pattern say "]" and then add a few lines before "]" "block1":"block_111" "tabId": "table_1", "title":"My title" ..... .... }] how do I achieve it using awk and sed. Thanks, Lakshmi (3 Replies)
Discussion started by: Lakshmikumari
3 Replies

2. Shell Programming and Scripting

Printing a block of lines from a file, if that block does not contain two patterns using sed

I want to process a file block by block using sed, and if that block does not contain two patterns, then that complete block has to be printed. See below for the example data. ................................server 1............................... running process 1 running... (8 Replies)
Discussion started by: Kesavan
8 Replies

3. UNIX for Advanced & Expert Users

Move a block of lines to file if string found in the block.

I have a "main" file which has blocks of data for each user defined by tags BEGIN and END. BEGIN ID_NUM:24879 USER:abc123 HOW:47M CMD1:xyz1 CMD2:arp2 STATE:active PROCESS:id60 END BEGIN ID_NUM:24880 USER:def123 HOW:4M CMD1:xyz1 CMD2:xyz2 STATE:running PROCESS:id64 END (7 Replies)
Discussion started by: grep_me
7 Replies

4. Shell Programming and Scripting

Grepping text block by block by using for loop

Hei buddies, Need ur help once again. I have a file which has bunch of lines which starts from a fixed pattern and ends with another fixed pattern. I want to make use of these fixed starting and ending patterns to select the bunch, one at a time. The input file is as follows. Hi welcome... (12 Replies)
Discussion started by: anushree.a
12 Replies

5. Shell Programming and Scripting

File Locking with fcntl on Darwin Mac OSX

Hello I have a Perl script that works on non-darwin Mac OS X environments and I think I have narrowed down the issue to a file locking problem. In other linux environments, the flock struct is defined differently. I have adjusted this via the reference for Mac OS X fcntl(2) man page. The... (4 Replies)
Discussion started by: flagman5
4 Replies

6. UNIX for Advanced & Expert Users

Deciding whether to get a buffer cache block or inode block

I was reading a book on UNIX internals "The design of the UNIX Operating system." There are two memory structures that are confusing me: 1) Buffer cache 2) Inode cache My questions are 1) Does a process get both buffer cache and Indoe cache allocated when it opens/creates a file? 2) if no,... (1 Reply)
Discussion started by: sreeharshasn
1 Replies

7. Programming

fcntl on socket

I have very simple client - server setup, where client connects, exchanges some messages with the server and then closes socket and exits. Everythink works OK, except when I am trying to change socket to be non-blocking AND the shell happens to be plain old Bourne. It runs no problem under ksh or... (3 Replies)
Discussion started by: migurus
3 Replies

8. Shell Programming and Scripting

how to append a block of statements after another block in the file

Hi I need to append the following block of statements in the middle of the file: # openpipe tsdbdwn2 set -x exec >> /tmp/tsdbdwn2.fifo 2>&1 # This needs to be appended right after another block of statements: if test $# -eq 0 ;then echo "Safety check - do you really wish to run" $0 "... (5 Replies)
Discussion started by: aoussenko
5 Replies

9. Programming

fcntl works in linux but not in mac os x

Hi, Unless I am missing some serious differences in Mac and linux in terms of C programming, I dont know why this would happen. Please take a look at the following piece of code fragment: bool add_input_to_db(Cons *new_data) { // Set the attributes of the lock struct flock fl =... (3 Replies)
Discussion started by: newhere
3 Replies

10. Programming

I have no clue what's the point - fcntl() ?

hi, I need to know how to lock a file. I used the following code, but after executing the program the file 'write.txt' remined empty, and I have no idea why.Maybe I'm not using the corresponding syntax for blocking a file. But I deleted then the blocking part and the problem persisted. see to... (2 Replies)
Discussion started by: atticus
2 Replies
Login or Register to Ask a Question