Это продолжение . Этот вопрос , я пытался реализовать приведенный там совет. Я каким-то образом могу напечатать значение в функции, но не могу напечатать его в функции вызывающей (основной).
Я получаю следующий вывод: Проблема в том, что функция printf
внутри print_affinity
правильная и позже возвращается к основному. но когда я пытаюсь напечатать значение указателя, он показывает неправильные значения. Я предполагаю, что это потому, что указатель уже увеличен внутри функции print_affinity
.
Как вывести правильное значение в функции вызывающего абонента?
sched_getcpu = 3
sched_getaffinity =
*ret is 0 //correct
*ret is 1 //correct
*ret is 2 //correct
*ret is 3 //correct
*(p + 0) : 3
*(p + 1) : 0
*(p + 2) : 0
*(p + 3) : 0
Код:
#define _GNU_SOURCE
#include <assert.h>
#include <sched.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int * print_affinity() {
cpu_set_t mask;
long nproc, i;
int enabled_core,j;
int *ret = (int *) malloc(sizeof (int));
if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
perror("sched_getaffinity");
assert(false);
} else {
nproc = sysconf(_SC_NPROCESSORS_ONLN);
printf("sched_getaffinity = ");
for (i = 0; i < nproc; i++) {
enabled_core = CPU_ISSET(i, &mask);
if ( enabled_core == 1 )
{
*ret = i;
printf("*ret is %d\n",*ret); //correct output
}
}
}
return ret;
}
int main(void) {
cpu_set_t mask;
long nproc;
int *p , i;
printf("sched_getcpu = %d\n", sched_getcpu());
nproc = sysconf(_SC_NPROCESSORS_ONLN);
p=print_affinity();
for ( i = 0; i <nproc ; i++ ) {
printf( "*(p + %d) : %d \n", i, *(p + i)); //incorrect output
//printf( "*(p + %d) : %d \n", i-nproc, *(p -nporc + 1)); //incorrect output
}
free(p);
return EXIT_SUCCESS;
}