2012-05-07 25 views
1

我必須爲我的課堂作業編寫一個線程示例。不知何故,我通過copy()創建了我的子進程之後得到了一個Segfault(必須使用那個可悲的)。Linux中的線程C程序中的Segfault

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字節?嘗試128K字節。 –

+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)。

這應該解決它。