开发者社区> 问答> 正文

如何识别是否在C中首次调用了特定文件

在执行C程序时,应将调试打印内容插入日志文件(例如log.txt),但是该C程序是在不同位置执行的。因此,在log.txt中找到了多个日志

我希望该调试仅在log.txt中出现一次。如何在C程序中插入检查以实现上述要求,我已经尝试过使用静态变量,但是仅对于第一次调用的函数而不是文件有效。访问功能是否会帮助这种情况?

展开
收起
祖安文状元 2020-01-07 14:23:20 350 0
1 条回答
写回答
取消 提交回答
  • 您需要某种方式让程序存储它们已完成的工作,称为信号量。

    最简单的操作是使用共享位置,例如/var/run/放置信号灯文件。然后,每个程序尝试创建该文件。如果已经存在,他们可以假定其他人已经执行了该操作。

    为此,我们使用open系统调用(不是fopen)进行精细控制。同时使用O_CREAT和O_EXCL标志表示要创建文件,如果文件已经存在,则会出错。这是原子的,我们正在检查文件是否存在,并在一个动作中创建它。不可能有两个程序会意外地同时检查和创建。

    #include <stdio.h>
    #include <fcntl.h>
    #include <stdbool.h>
    
    bool check_semaphore(const char *file) {
        if( open(file, O_CREAT|O_EXCL) >= 0 ) {
            return true;
        }
        else {
            return false;
        }
    }
    
    int main() {
        if( check_semaphore("did_debug_log") ) {
            FILE *log = fopen("log.txt", "a");
            if( !log ) {
                perror("Couldn't open log.txt");
            }
    
            fprintf(log, "Some debug stuff\n");
        }
    }
    
    

    您可以将更复杂的共享存储用作信号灯,例如共享内存或共享数据库(例如SQLite),但是基本技术是相同的。检查操作是否已完成,同时还声明您将通过原子操作进行操作。

    2020-01-07 14:23:29
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
软件定义的数据智能 立即下载
内容安全检测与管控 立即下载
优化4K制作流程,创建“4K视觉云”服务 立即下载