2014-12-14 4 views
1

Я изучаю операционную систему. Когда я тестирую этот код, у меня возникает эта проблема - ошибка сегментации, ядро ​​сбрасывается. Как решить эту проблему?Ошибка: ядро ​​отказа от сегментации

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

int main() 
{ 
    int p,*stat_addr; 
    while((p=fork())==-1); 
    if(p==0) 
     exit(0); 
    else 
    { 
     wait(stat_addr); 
     printf("%d\n",*stat_addr); 
     exit(0); 
    } 
} 
+0

'stat_addr' не инициализирован. – chux

+0

Вы передаете неинициализированный указатель на 'wait'. Затем вы разыгрываете его в вызове 'printf'. Вы должны сделать что-то вроде 'int stat_addr;' ... 'wait (& stat_addr); printf ("% d", stat_addr); '. – ach

+1

Помимо неопределенного поведения при использовании неинициализированных (нестатических) локальных переменных ваша программа плохо сформирована, потому что вы не определяете функцию 'main' правильно. –

ответ

0

Использование:

int status; 
int corpse = wait(&status); 

Труп является PID мертвого ребенка (или -1, если нет детей нет слева). Статус выхода кодируется в status, если corpse == -1.

Вы столкнулись, потому что у вас есть неинициализированный указатель. Я подозреваю, что вы смущены прототип wait() функция в:

pid_t wait(int *stat_loc); 

Да, он принимает указатель, но он должен быть указатель инициализируется точки на что-то. Или, как правило, это адрес переменной int, как и в случае с &status в моем рекомендуемом использовании.

1

Это потому, что вы не инициализировали stat_addr. Сделайте что-то вроде:

int stat_addr = 10; 

, а затем использовать его как:

wait(&stat_addr); 
+0

Суффикс '_addr' больше не подходит (хотя он работает, конечно). Инициализация кажется бессмысленной. –

+0

Спасибо @JonathanLeffler Я только что использовал переменную OP, и я согласен с вами. – SMA

Смежные вопросы