gpt4 book ai didi

c - 使用 fnctl() 锁定和解锁文件以进行读写(多个进程)

转载 作者:行者123 更新时间:2023-11-30 17:31:59 24 4
gpt4 key购买 nike

我目前正在尝试实现一个并发服务器(即通过 fork 新的子进程来处理多个进程)。

每个客户端都会执行读/写请求,以从服务器中的 file.txt 中读取内容。我目前正在使用 fnctl() 来处理同步,即。我可以进行多次读取,但只能进行一次写入。

这是我到目前为止所做的示例代码:

{
FILE *file = fopen("file.txt", "w+");

fd = fileno(file);

printf("\nThis is the file descriptor : %d\n", fd);

if(file == NULL)
printf("File cannot be opened");

printf("\nLocking!!!!");

//initliazing the flock structure
memset(&lock, 0, sizeof(lock)); //setting 0 as a value
lock.l_type = F_WRLCK; //F_RDLCK, F_WRLCK, F_UNLCK
lock.l_whence = SEEK_SET; //SEEK_SET, SEEK_CUR, SEEK_END
lock.l_start = 0; //offset from l_whence
lock.l_len = 0; //length, 0 = to EOF
lock.l_pid = getpid(); //the processes's PID


//placing a write lock on the file
fcntl(fd, F_SETLKW, &lock);

printf("\nLocked-------");

fwrite(buff + 1, 1, strlen(buff) - 1, file);
//lock_realease(&l);
printf("\nHit enter to unlock the file !");
getchar();

printf("\nFinished writing so we can unlock file !");

//Releasing lock
lock.l_type = F_UNLCK; //unlocks the region of the file
fcntl(fd, F_SETLKW,&lock);

printf("\nFile unlocked!");
}

如果我的方向正确,有人可以指导我吗?

最佳答案

也许吧。您必须添加错误处理(以便您在锁定失败时注意到)、等待(当锁定失败时)和超时(当另一个 child 卡住并且锁永远不会释放时)。

但根据我的经验,这个过程很脆弱。相反,创建一个套接字。让 children 连接到 socket 。然后使用主进程向子进程提供命令。在这种情况下,主进程将替换单个文件。

这有几个优点:

  • 主进程密切关注子进程的状态(他们正在做什么),您可以编写一个工具来查看此统计信息。稍后,您可以将其用于健康监控。
  • 您不需要使用套接字锁定。

关于c - 使用 fnctl() 锁定和解锁文件以进行读写(多个进程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com