gpt4 book ai didi

c - 在这种情况下哪种操作系统概念应该更好

转载 作者:行者123 更新时间:2023-11-30 16:53:06 24 4
gpt4 key购买 nike

我正在实现一个 C 代码,其中有这个场景

我有一个二进制code,执行时会连续写入名为log.txt的文件中。现在我同时打开终端2并运行code 再次二进制,同时也会写入文件log.txt

我想阻止这种情况发生。我的逻辑是,当第一个二进制文件正在工作并写入文件 log.txt 时,二进制文件的第二个执行实例也需要写入 log.txt 但应该阻止它。我可以实现哪些选项这个?

我计划在 C 编程中使用信号量来实现此目的。但如果有人有其他选择,请告诉我

最佳答案

如果您正在创建线程,那么您需要使用信号量或互斥量来保护文件描述符,因为 FD 与所有线程共享。

另一种方法是fcntl()使用struct folrd结构来定义和检查文件锁。

当您想要保护超出地址空间的文件时,您应该使用struct flock 或 semaphore,因为互斥体无法在地址空间之外工作。我写了一个应用程序供您引用,您看一下。

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

#define printf(x) printf("%s\n", x)

int main(int argc, char *argv[])
{
const char filepath[30] = "/Users/darthvader/testlock";
struct flock *new_wt_lock = (struct flock *) malloc(sizeof(struct flock));
FILE *fp;

memset(new_wt_lock, 0, sizeof(struct flock));
new_wt_lock->l_type = F_WRLCK;
new_wt_lock->l_len = 0;

fp = fopen(filepath, "w+");
if(fp == NULL)
{
perror("Error opening file for writing");
exit(EXIT_FAILURE);
}
printf("Attempting to acquire write lock");
if( fcntl(fileno(fp), F_SETLK, new_wt_lock) == -1)
{
printf("Unable to acquire lock");
perror("error");
exit(EXIT_FAILURE);
}

printf("Doing random shit...");
sleep(25);
printf("Stopped doing random shit");

if(fcntl(fileno(fp), F_UNLCK, new_wt_lock) < 0)
{
perror("Error releasing lock");
exit(EXIT_FAILURE);
}

printf("Released Lock...Exiting");
}

关于c - 在这种情况下哪种操作系统概念应该更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41015849/

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