在执行C程序时,应将调试打印内容插入日志文件(例如log.txt),但是该C程序是在不同位置执行的。因此,在log.txt中找到了多个日志
我希望该调试仅在log.txt中出现一次。如何在C程序中插入检查以实现上述要求,我已经尝试过使用静态变量,但是仅对于第一次调用的函数而不是文件有效。访问功能是否会帮助这种情况?
您需要某种方式让程序存储它们已完成的工作,称为信号量。
最简单的操作是使用共享位置,例如/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),但是基本技术是相同的。检查操作是否已完成,同时还声明您将通过原子操作进行操作。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。