【问题标题】:How can I calculate how many times the program has been run in C? [closed]如何计算程序在 C 中运行了多少次? [关闭]
【发布时间】:2017-01-27 02:25:27
【问题描述】:

是否可以计算一个程序在 C 中运行了多少次? 我需要设置计数器吗?例如:

#include <stdio.h>

int main()
{
    int var1;
    scanf("%d", &var1);

    int var2;
    scanf("%d", &var2);

    int var3;

    var3 =var1 + var2;

    printf("The answer is  = %d" , var3);

   /* if (The program ran for more than two times) {
        printf("The program is only allowed to run once or twice\n");
    }
    else {
      printf("The answer = %d" , var3);
    }*/

    return 0;
}

如果程序已经运行了两次,程序会显示一次错误信息并重新开始计数。

【问题讨论】:

  • 如果你想计算你的可执行文件已经运行了多少次,你需要读取和写入一个文件或其他一些持久内存(例如,如果你在 windows 机器上,windows 注册表)。
  • 显然您必须创建一个文件来存储执行计数,在程序开始时读取它以查看它之前运行了多少次,添加一个,并在退出时将其写回更新存储的值。你可以在这个网站上搜索[c] write to file(以及read),看看如何做那种事情。
  • @eyllanesc 我看不到连接。你能解释一下为什么你认为这是重复的吗?
  • @eyllanesc:第三个问题不清楚,但肯定不是你链接的内容。

标签: c


【解决方案1】:

我们可以将this answer结合一些简单的文件IO来达到想要的效果。

请注意,这只是一个示例,说明如何计算程序运行的次数。请不要在未仔细考虑此答案下方评论中指出的问题的情况下在任何安全敏感的上下文中使用它。

#include <unistd.h>
#include <sys/file.h>
#include <stdio.h>


int main(){
    int myCounterFd;
    if ((myCounterFd = open ("/tmp/myappname.counter", O_CREAT | O_RDWR, 0666)) < 0) {
        return -1;
    }
    if (flock (myCounterFd, LOCK_EX | LOCK_NB) < 0) {
        return -1;
    }
    FILE* fp = fdopen(myCounterFd, "w+");
    int count;
    size_t error;
    error = fread(&count, sizeof(count), 1, fp);

    printf("Error = %zu\n", error);
    // The program has never been run before
    if (error < 1) {
        count = 1;
        fwrite(&count, sizeof(count), 1, fp);
    } else{
        count++;
        rewind(fp);
        fwrite(&count, sizeof(count), 1, fp);
    }
    fflush(fp);
    printf("Program has now been run %d times.\n", count);

    flock (myCounterFd, LOCK_UN);
    close(myCounterFd);
}

【讨论】:

  • 将权限设置为 666 是非常糟糕的,尤其是因为这意味着任何人都可以随时将计数器重置为零。还有一个权限问题:虽然运行该程序的任何人都应该能够使用该程序写入文件,但您不希望任何不运行该程序的人修改该文件,除了所有者。那么,也许您需要一个 SUID 程序?那是更高级的东西。在/tmp 中具有已知名称的文件也可能不是一个好主意。这个名字必须知道,但是……挑剔——我知道。
  • 你在所有这些点上都是绝对正确的,我要补充一点,这只是一个外部持久性的例子,而不是用于生产用途。
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多