gpt4 book ai didi

c - 如何在C程序运行时正确调用可执行文件?

转载 作者:行者123 更新时间:2023-11-30 17:00:08 25 4
gpt4 key购买 nike

我有一个 C 应用程序,其工作之一是调用可执行文件。该文件在编译期间在中间代码级别插入了性能测量例程。它可以测量时间或 L1/L2/L3 缓存未命中情况。换句话说,我修改了 LLVM 编译器以插入对该函数的调用,并将结果打印到任何已编译程序的 stdout

现在,就像我在开头提到的那样,我想从单独的 C 应用程序执行该程序(将此结果返回到 stdout)并保存该结果。我现在的做法是:

void executeProgram(const char* filename, char* time) {
printf("Executing selected program %s...\n", filename);
char filePath[100] = "/home/michal/thesis/Drafts/output/";
strcat(filePath, filename);
FILE *fp;
fp = popen(filePath, "r");
char str[30];
if (fp == NULL) {
printf("Failed to run command\n" );
exit(1);
}
while (fgets(str, sizeof(str) - 1, fp) != NULL) {
strcat(time, str);
}
pclose(fp);
}

其中filename是要运行的已编译可执行文件的名称。结果保存到 time 字符串中。

问题是,与简单地从命令行“手动”运行可执行文件返回的结果相比,我得到的结果非常不同且不稳定(./test16) 。它们看起来像:

231425 
229958
230450
228534
230033
230566
231059
232016
230733
236017
213179
90515
229775
213351
229316
231642
230875

所以它们大多在 230000 美元左右,偶尔会有一些下降。从另一个应用程序中运行相同的可执行文件会生成:

97097 
88706
91418
97970
97972
94597
95846
95139
91070
95918
107006
89988
90882
91986
90997
88824
129136
94976
102191
94400
95215
95061
92115
96319
114091
95230
114500
95533
102294
108473
105730

请注意,正在调用的是相同可执行文件。然而它返回的测量时间是不同的。正在测量的程序由对简单嵌套循环的函数调用组成,用于访问数组元素。这是代码:

#include "test.h"
#include <stdio.h>

float data[1000][1000] = {0};


void test(void)
{
int i0, i1;
int N = 80;
float mean[1000];
for (i0 = 0; i0 < N; i0++)
{
mean[i0] = 0.0;
for (i1 = 0; i1 < N; i1++) {
mean[i0] += data[i0][i1];
}
mean[i0] /= 1000;
}
}

我怀疑代码中调用程序的方式有问题,也许应该 fork 进程或者其他什么?有什么想法吗?

最佳答案

您没有指定时间测量子例程的具体插入位置,因此我真正能提供的只是猜测。

结果似乎暗示了完全相反的情况 - 从 shell 运行应用程序速度较慢,因此我不会担心从 C 代码启动进程的方式。我的猜测是 - 当您从 shell 运行程序时,终端会减慢您的速度。当您从 C 代码运行该进程时,您将输出通过管道传输回“启动”应用程序,该应用程序已经在等待管道上的输入。

顺便说一句,请考虑从 strcat 切换到更安全的方式,例如 strncat

关于c - 如何在C程序运行时正确调用可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37763682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com