简体   繁体   中英

The file locking program is NOT LOCKING FILES

I have made a program to have advisory file locking in the c program and below is the code I have written for the task.

#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>


int controller, fsize;
char data[1000], ch;
int fd ;
                  /* l_type, l_whence, l_start, l_len, l_pid*/
struct flock fl = {F_UNLCK, SEEK_SET,    0,       0,      0};
void Edit();
void Delete();
void Exit();
void Lock();


void main()
{

do
{
    clrscr();
    fd = open("demo.txt", "w");
    FILE *fp = fdopen("demo.txt", "w");
    if (fd != NULL)
    {
        printf("Opening the file!\n");
        fd = fdopen("demo.txt", "r");
        printf("We can open the file in write mode, meaning no other process has lock enabled on it.");
        printf("Contents of the file are: \n\t");
        readfile(fd);
        fclose(fd);
    }
    else if ((fd = fopen("demo.txt", "r"))!= NULL)
    {
        fd = fopen("demo.txt", "r");
        printf("We can open the file in read mode, meaning some other process has locked the write permissions on it.");
        printf("Contents of the file are: \n\t");
        readfile(fd);
        fclose(fd);
    }
    else
    {
        printf("File does not exist.\n");
    }
    printf("\n\t\t***** WELCOME USER! THIS IS A SIMPLE TEXT EDITOR *****");

    Lock();
    Operations();
}
while(1);
}

void Lock()
{
fd = fopen("demo.txt", "w");
fl.l_type = F_RDLCK;
fl.l_pid = getpid();
if (fcntl(fd, F_SETLK, &fl) == -1)
{
    printf("Can't set exclusive lock\n");
}
else if(fl.l_type!=F_UNLCK)
{
    printf("File has been exclusively locked by the process %d\n", fl.l_pid);
    fl.l_type = F_UNLCK;
    printf("File Unlocked! Other processes can execute on the file now.");
}
else
{
    printf("File is not locked\n");
}
fclose(fd);
}

void clrscr()
{
system("@cls||clear");
}

void Operations()
{
    printf("\n\n\tOperations you can perform here:\n\t\n");
    printf("\n\t1.ADD TO FILE\n\t2.DELETE THE FILE\n\t3.EXIT\n");
    printf("\n\tEnter your choice: ");
    scanf("%d",&controller);
    switch(controller)
    {
    case 1:
        Add();
        break;
    case 2:
        remove("demo.txt");
        break;
    case 3:
        exit(0);
    }
}



void Add()
{
    fd = fopen("demo.txt", "a");
    printf("Enter contents to store in file : \n");
    fgets(data, 1000, stdin);
    fputs(data, fd);
    fclose(fd);
    printf("Data added to the file successfully");
    fd = fopen("demo.txt", "r");
    readfile(fd);
    fclose(fd);
}



void readfile(FILE *fPtr)
{
char c = getc(fd);
while (c != EOF)
{
    printf("%c", c);
    c = getc(fd);
}
}

The program is made such that it issues advisory locking whenever there is another attempt to open that particular file in another process. The new user(from new process) can then however edit the file.

But the program is not working properly. Can anyone please help me find the error in the code. I am not able to identify what is it that I am doing wrong?

Does that program even compile? Advisory locks are only advisory, they don't prevent other processes from opening the files, or do read/write. They only tell you when it is safe to use the file descriptors. So the way to use them, is to only do read/write when you actually have the lock.

The meaning of "safe" in this context cannot have a generic answer, it depends on use case. But typically implies that the programmer(s) have ensured that the file is in a consistent state before acquisition and after release of the lock.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM