【问题标题】:Getting program metadata from own program从自己的程序中获取程序元数据
【发布时间】:2013-09-10 19:51:54
【问题描述】:

如何将以下值带入我的 C 程序变量​​:

  • 用于执行程序的 CPU,即在同一程序上花费了多少处理器。

  • 程序的执行时间,即完成的时间。

  • 编译器警告,即如何在自己的程序中将编译器警告放在字符串变量上?

  • 我的程序到磁盘的大小:程序占用了我的硬盘。

我觉得这很难做到,我不知道有什么办法。

提前感谢大家

【问题讨论】:

  • 您能否提供有关您所针对的操作系统的更多信息?

标签: c++ c file metadata system


【解决方案1】:

可执行文件的编译器警告是仅在您的程序构建后才可用的信息。所以我认为将这些信息静态打包到“C 程序变量”中并不容易。

您可以将此数据保存到文件中作为附加的构建步骤。例如,编写一个执行编译器并读取其输出的程序。然后,该程序会将数据保存到文件中,或者将链接器提供给它并告诉它将其打包为资源(但是您会丢失链接器警告)。

大小、cpu 使用率和运行时间是程序在运行时可以获取的信息。您可以使用 C 库(fopen 等)轻松获取文件的大小。运行时间可以通过在应用程序启动时启动计时器来获得,并且在退出之前读取该计时器以获得总运行时间。我认为对于 cpu 的使用情况,您必须询问操作系统(谷歌快速搜索 windows 得到了我 this

【讨论】:

    【解决方案2】:

    [编辑包括程序执行时间,文件大小]

    仅适用于 Windows:这里有一些代码可用于获取您想要的一些内容。此实现仅返回 PeakWorkingSize,但我已经包含了结构的注释副本,其中包含您可以获得的所有值,并进行了少量修改。如果包含 psapi.lib(Windows SDK 安装的一部分,可免费下载 here),这将在 ANSI C 中编译和构建

    #include <windows.h>
    #include <ansi_c.h>
    #include <psapi.h>
    
    time_t GetMemUsage(void);
    
    int main(int argc, char *argv[])
    {
        DWORD start, elapsed; // for program execution time
        size_t memory; //for cpu usage;
        DWORD  filesize=0; //for exe file size
        FILE *fp;
        char buf[260];
        int i;
    
        start = GetTickCount();
    
        sprintf(buf, ".\\%s", argv[0]);
    
        fp = fopen(buf, "r");
    
        filesize = GetFileSize(fp, NULL);
    
        for(i=0;i<1000000;i++); //so ticks will be more than zero
    
        memory = GetMemUsage();
    
        fclose(fp);
    
        elapsed = GetTickCount() - start; //note, possible rollover, 
    
        return 0;   
    }
    
    time_t GetMemUsage(void)
    {
        HANDLE hProcess;
        PROCESS_MEMORY_COUNTERS pmc;
        DWORD processID = GetCurrentProcessId();
    
        hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                        PROCESS_VM_READ,
                                        FALSE, processID );
        GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc));
        CloseHandle(hProcess);
    
    //  typedef struct _PROCESS_MEMORY_COUNTERS {
    //      DWORD cb;
    //      DWORD PageFaultCount;
    //      SIZE_T PeakWorkingSetSize;
    //      SIZE_T WorkingSetSize;
    //      SIZE_T QuotaPeakPagedPoolUsage;                             
    //      SIZE_T QuotaPagedPoolUsage;
    //      SIZE_T QuotaPeakNonPagedPoolUsage;
    //      SIZE_T QuotaNonPagedPoolUsage;
    //      SIZE_T PagefileUsage;
    //      SIZE_T PeakPagefileUsage;
    //  } PROCESS_MEMORY_COUNTERS;
    
    typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
    
        return pmc.PeakWorkingSetSize;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-22
      • 2011-12-18
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多