c - 如何在 C 中读取文件时防止任何其他进程写入文件?
问题描述
背景
在我的 C 程序中,我正在逐行读取文件。
FILE *file = fopen("config.txt", "r");
if (file)
{
char *line;
size_t length;
size_t read;
int test_case_number = 0;
while ((read = getline(&line, &length, file)) != -1)
{
printf("%s", line);
}
}
else
{
fputs("The provided <PATH_TO_CONFIG FILE> does not exist.\n\n");
exit(1);
}
问题
但是,当我阅读此文件时,我想防止任何其他进程在读取该文件config.txt
时对其进行写入。我怎样才能做到这一点?
解决方案
在 Linux 中,您可以使用flock()(由我关注):
对打开的文件应用或删除建议锁。
LOCK_EX放置一个排他锁。在给定时间,只有一个进程可以为给定文件持有独占锁。
但是,您需要使用open()
, 而不是fopen()
.
带有抽象示例的问题:flock():删除没有竞争条件的锁定文件?或者检查这个例子。
重要提示:正如@JonathanLeffler 评论的那样“注意术语“咨询锁”——这意味着如果写入过程不测试锁,它将能够写入。在类似 POSIX 的系统上,您可以使用flock()
或lockf()
或fcntl()
锁定文件描述符通过fileno(fp)
“。
推荐阅读
- c++ - 为什么将 const 对象传递给期望非 const 模板类型参数的模板化函数会导致编译错误?
- java - XMLElement 与 XMLAttribute 结合创建新对象
- python - 在 tensorflow 2 中使用回调信息训练神经网络
- kotlin - Corda - 注册和监听处理程序/响应程序流
- java - 如何将此 SQL 转换为 JPA?
- c# - 无法将数据更新到数据库中
- ios - iOS中有没有像__arm64e__这样的宏?
- excel - 相同原始 Power BI 中每个类别的百分比差异
- nginx - phpmyadmin 的 NGiNX 自定义路径
- oracle - 在 Oracle 包/过程/触发器/函数中编写的查询