sigemptyset () перезаписывает следующую переменную - PullRequest
0 голосов
/ 20 января 2012

У меня есть глобальные переменные

int a[10];
struct sigaction act;
int b[10];

Всякий раз, когда я звоню

sigemptyset(&act.sa_mask); 

массив a поврежден. Я сомневаюсь, что это проблема компилятора. Я использую CodeSourcery mips-linux-gnu-gcc версии 4.5.2. Я компилирую, используя

mips-linux-gnu-gcc -c -g -muclibc -pedantic -Wno-declaration-after-statement -std=gnu99 -G 0 -mips2 -msoft-float -mno-memcpy -fomit-frame-pointer -pipe -Wall -Wstrict-prototypes signal/signal.c

mips-linux-gnu-gcc -G 0 -msoft-float -static -o signal  signal.o

Мой полный код следующий:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
int a[10];
struct sigaction act;
int b[10];


int main ();
int main ()
{
int i;
//initialize a and b
for(i = 0 ; i < 10;i++)
{
    a[i]=1;b[i]=1;
}

sigemptyset(&act.sa_mask);

//print
for(i = 0 ; i < 10;i++)
{
    printf("%d %d ",a[i],b[i]);
}

return 0;
}

Я обнаружил, что использование опции -muclibc для компиляции вызывает эту проблему.

Ответы [ 2 ]

0 голосов
/ 23 января 2012

я нашел ответ Я не связываюсь с опцией -muclibc

mips-linux-gnu-gcc -G 0 -msoft-float -static -muclibc -o signal  signal.o

решит проблему

, поэтому при компиляции он использует sigset.h из uclibc и при его выполнении был выполнение кода из libc (signal.c sigemptyset())

и если вы продолжите копать дальше, _SIGSET_NWORDS для mips равно 4, а для x86 - 32 поэтому sigemptyset() работал 32 итерации вместо 4

0 голосов
/ 20 января 2012

Вы показываете struct sigaction act после массива, но в коде вы упоминаете переменную siginfo, а не act.

Может ли siginfo быть объявлено до массива? Не могли бы вы показать, что делает эта функция?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...