gpt4 book ai didi

c - 测量n个进程的时间

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:09 25 4
gpt4 key购买 nike

所以我要根据它们的 nice 值来测量 n 个进程的时间。我从父进程 fork 了 n 个进程,它们所要做的就是在无限循环中从 0 到 X 计数一个计数器,每次打印它们从 0 到 X 计数一次所需的时间。

我想这是系统编程实验室的标准练习。

我正在将这个实验的输出保存到一个 csv 文件中,以计算出诸如进程的平均时间之类的东西,但是..我已经破坏了输出。

我的代码:

  #include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <time.h>
#include <unistd.h>
#include <wait.h>


int exitSTATUS=0;
int *t = NULL;



void inputWarning() { printf("Falsche Eingabe"); }

long to_us(const struct timespec *spec) {
// inversion of to_spec from above ^
return spec->tv_sec * 1000000 + spec->tv_nsec / 1000;
}

void handleSIGINT_child(int sig){
exitSTATUS=1;
}
void handleSIGINT_parent(int sig){
if(t!= NULL)
free(t);
}

void testTime(int n, int *t, int X) {
pid_t pid;
int i;
for (i = 0; i < n; i++) {
pid = fork();

if (pid < 0) {
// TODO: Errer handling
} else if (pid == 0) {

signal(SIGINT,handleSIGINT_child);

setpriority(PRIO_PROCESS, 0, t[i]);

while (1) {
if(exitSTATUS>0) exit(0);
struct timespec delta = {0, 0};
long current_us = 0;
// clock for higher precision on difference
clock_gettime(CLOCK_REALTIME, &delta);
current_us = to_us(&delta);

int j;
for (j = 0; j < X; j++) {
}
clock_gettime(CLOCK_REALTIME, &delta);
long diff = to_us(&delta) - current_us;

printf("%i;%lu\n", i, diff);
}
}
}
if (pid > 0) {
signal(SIGINT,handleSIGINT_parent);
wait(NULL);
}
};

int main(int argc, char *argv[]) {
if (argc >= 4) {
int n = strtol((argv)[1], NULL, 10);
t = malloc(n*sizeof(int));
if (n >= 0 && argc >= n + 3) {
int i;
for (i = 0; i < n; i++) {
int niceval =
strtol(argv[i + 2], NULL, 10); // TODO : Auf parseError prüfen
t[i] = niceval;
}
int X = strtol(argv[n + 2], NULL, 10);
testTime(n, t, X);
free(t);
return 0;
}
}
inputWarning();
if (t != NULL) {
free(t);
}
return 0;
}

在输出中我得到了一些奇怪的东西

1;4287
1;4366
1;4774
1;4243
1;4492
10;8539
0;5856
0;6558
0;6462
0;5886

第 6 行的 10 是错误的,因为我只有三个进程。我猜 1 是第一个进程的输出,而 0 是第 0 个进程的输出。

关于这个原因,我有两个想法。1.程序被sigint终止。这会导致输出突然中断。2. 流程之间的变化导致了削减。

无论如何,我只是想让我的输出干净整洁。

如有任何帮助,我们将不胜感激。 :)

编辑:

只是为了复制:

生成文件:

OBJ=main.o
CC=gcc
CFLAGS=-g -Wall -Wextra -std=gnu11

app: $(OBJ)
$(CC) $(CFLAGS) -o $@ $(OBJ)

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<

clean:
rm -f *.o app

和运行命令

./app 3 19 0 0 2000000 > output.csv

最佳答案

printf 之后简单地刷新 stdout 缓冲区应该可以解决问题:

printf("%i;%lu\n", i, diff);
fflush(stdout);

无论如何,我还建议锁定文件,以防在此过程中发生上下文切换:

flock(fileno(stdout), LOCK_SH);
printf("%i;%lu\n", i, diff);
fflush(stdout);
flock(fileno(stdout), LOCK_UN);

另一种方法也是使用互斥量。

这给了我一个正确的输出,但它似乎总是在进程之间切换。因此,您的输出将在每一行(或 2 或 3 行取决于切换)中打印不同的过程。

关于c - 测量n个进程的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524268/

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