Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何识别特定文件是否在C中第一次被调用_C_Linux - Fatal编程技术网

如何识别特定文件是否在C中第一次被调用

如何识别特定文件是否在C中第一次被调用,c,linux,C,Linux,执行C程序时,应将调试打印插入日志文件(如log.txt), 但是这个C程序是从不同的地方执行的。 因此,在log.txt中找到了多个日志 我希望调试在log.txt中只出现一次。 如何插入一个签入C程序来实现上述要求 我尝试过使用静态变量,但它只有在第一次调用函数时才起作用 不是档案。 访问功能是否有助于此场景???您需要一些方法让程序存储它们所做的事情,称之为 最简单的方法是使用共享位置,如/var/run/来放置信号量文件。然后每个程序都尝试创建该文件。如果它已经存在,他们可以假设其他人已

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

我希望调试在log.txt中只出现一次。 如何插入一个签入C程序来实现上述要求 我尝试过使用静态变量,但它只有在第一次调用函数时才起作用 不是档案。
访问功能是否有助于此场景???

您需要一些方法让程序存储它们所做的事情,称之为

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

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

#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");
    }
}
#包括
#包括
#包括
布尔检查信号量(常量字符*文件){
如果(打开(文件,O|u创建| O_排除)>=0){
返回true;
}
否则{
返回false;
}
}
int main(){
if(检查信号量(“did调试日志”)){
文件*log=fopen(“log.txt”,“a”);
如果(!log){
perror(“无法打开log.txt”);
}
fprintf(log,“一些调试内容”\n);
}
}

您可以使用更复杂的共享存储作为信号量,如共享内存或共享数据库(如SQLite),但基本技术是相同的。检查操作是否已完成,同时声明您将在原子操作中执行此操作。

多个程序是否同时运行并全部写入同一个日志文件?是否希望多个程序只记录一次该文件?或者您希望一次只运行一个程序?该方法可以,但我希望在特定位置创建“did_debug_log”文件。我没有在主文件夹或c程序所在的任何位置创建的设置executed@fox18您可以将文件放在适合您的环境的任何位置。也许在日志文件旁边。