【发布时间】:2021-03-29 22:47:48
【问题描述】:
我已经制作了一个程序来在 c 程序中锁定咨询文件,下面是我为该任务编写的代码。
#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);
}
}
该程序是这样设计的,当在另一个进程中再次尝试打开该特定文件时,它会发出建议锁定。然后,新用户(来自新进程)可以编辑该文件。
但程序运行不正常。谁能帮我找出代码中的错误。我无法确定我做错了什么?
【问题讨论】:
-
你得到了一个锁,但一瞬间释放它(
fclose(fd);) -
我无法打开和丢失文件。我应该在哪里打开文件,我应该在哪里关闭它?我想我应该在程序执行的整个过程中都有一个文件锁。或者至少在进程请求切换之前拥有它
-
然后在您即将退出时关闭文件(或者根本不关闭,让操作系统在程序退出时自动关闭它)。
-
您似乎创建了一个新用户帐户,以便再次提出 [previous closed question]() 而不解决导致问题被关闭的任何问题。我不认为这特别有帮助。您还应该尝试了解在 cmets 中发现的问题,包括文件描述符 (
ints) 和标准库FILE*之间的混淆。如果你在编译时启用了警告,编译器也会产生警告信息。
标签: c file-locking fcntl