Итак, я могу измерить время для n процессов в зависимости от их приятных значений.Я разветвляю 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
10 в 6-й строке неверно, потому что у меня только три процесса.Я предполагаю, что 1 осталось от выхода 1-го процесса, а 0 - это выход 0-го процесса.
У меня есть две идеи относительно причины этого.1. Программа завершается с помощью sigint.Это вызывает резкое сокращение выходных данных.2. Изменения между процессами вызывают это сокращение.
В любом случае я просто хочу, чтобы мой вывод был красивым и понятным для работы с ним.
Любая помощь будет принята с благодарностью.:)
РЕДАКТИРОВАТЬ:
только для воспроизведения:
make-файл:
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