Monday 7 November 2011

How can I prevent another program from modifying part of a file that I am modifying? in C programming

How can I prevent another program from modifying part of a file that I am modifying?

Under DOS 3.0 and later, file sharing can be implemented by using the SHARE.EXE program (see FAQ
IV.13). Your C compiler library comes with a function named locking() that can be used to lock and unlock
portions of shared files.

The locking function takes three arguments: a handle to the shared file you are going to lock or unlock, the
operation you want to perform on the file, and the number of bytes you want to lock. The file lock is placed
relative to the current position of the file pointer, so if you are going to lock bytes located anywhere but at
the beginning of the file, you need to reposition the file pointer by using the lseek() function.

The following example shows how a binary index file named SONGS.DAT can be locked and unlocked:

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <process.h>
#include <string.h>
#include <share.h>
#include <sys\locking.h>
void main(void);
void main(void)
{
int file_handle, ret_code;
char* song_name = “Six Months In A Leaky Boat”;
char rec_buffer[50];
file_handle = sopen(“C:\\DATA\\SONGS.DAT”, O_RDWR, SH_DENYNO);
/* Assuming a record size of 50 bytes, position the file
pointer to the 10th record. */
lseek(file_handle, 450, SEEK_SET);
/* Lock the 50-byte record. */
ret_code = locking(file_handle, LK_LOCK, 50);
/* Write the data and close the file. */
memset(rec_buffer, ‘\0’, sizeof(rec_buffer));
sprintf(rec_buffer, “%s”, song_name);
write(file_handle, rec_buffer, sizeof(rec_buffer));
lseek(file_handle, 450, SEEK_SET);
locking(file_handle, LK_UNLCK, 50);
close(file_handle);
}

Notice that before the record is locked, the record pointer is positioned to the 10th record (450th byte) by
using the lseek() function. Also notice that to write the record to the file, the record pointer has to be  repositioned to the beginning of the record before unlocking the record.

Cross Reference:

IV.13: How can I open a file so that other programs can update it at the same time?
IV.14: How can I make sure that my program is the only one accessing a file?

No comments:

Post a Comment