2012-05-07 2 views
1

Мне нужно закодировать пример потока для моей домашней работы в классе. Как-то я получаю Segfault после создания моего дочернего процесса через copy() (нужно использовать это к сожалению).Segfault в поточной программе C на Linux

void thread(void); 
#define CLONE_VM  0x00000100 
#define ANSWER_TRUE  "t" 
#define ANSWER_FALSE "f" 

static char stack[2]; 

int main(void) { 
void** childThreadBP = NULL; 
void** childThread = NULL; 

int pid = 0; 

puts("create stack for child process..."); 
void ** new_stack = (void **) malloc(128);  
//new_stack = (void **) ((char *)new_stack + 128); 

puts("create child process...");  
pid = clone(thread, new_stack, CLONE_VM, NULL); 

puts("write PID to shared stack..."); 
stack[0] = (char) pid; 

puts("child answered:"); 
while(1){} 
if (stack[1] == ANSWER_TRUE) { 
    puts("PIDs are equal."); 
} 
else { 
    puts("PIDs are NOT equal."); 
} 
return EXIT_SUCCESS; 
} 

void thread(void) { 
puts("[child]: I'm alive!"); 
int pidSelf; 

pidSelf = getpid(); 
if (pidSelf == (int)stack[0]) { 
    puts("[child]: dad the PID you gave me is correct!"); 
    stack[1] = ANSWER_TRUE; 
} 
else { 
    puts("[child]: dad the PID you gave me is NOT correct!"); 
    stack[1] = ANSWER_FALSE; 
} 
} 

Возможно, вы видите, что моя ошибка ... - что не так с кодом?

Я просто нужна помощь фиксации неисправности сегм - остальное должно быть в порядке (я думаю;))

привет !!

+1

Почему вы используете 'clone (2)' вместо библиотеки pthreads? –

+0

128 байтов? Попробуйте 128 Кбайт. –

+0

@AdamRosenfield: потому что нам нужно ...:/ – reijin

ответ

2

У вас есть несколько вопросов. Во-первых, как сказал Мартин Джеймс, вам нужен больший размер стека. Я использовал 16384, и это сработало. Во-вторых, вам нужно передать в верхней части пространства памяти, свою линию:

new_stack = (void **) ((char *)new_stack + 128); 

это хорошо, раскомментируйте его и изменить его на больший размер стека:

void ** new_stack = (void **) malloc(16384);  
new_stack = (void **) ((char *)new_stack + 16384); 

В-третьих, у вас есть проблема с вашим хранилищем PID. Массив стека должен быть целым числом, поскольку pid может быть больше, чем может иметь переменная char (мой PID был 25689).

Это должно быть исправлено.

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