1

クラスの宿題用にスレッドの例をコーディングする必要があります。どういうわけか、copy() を介して子プロセスを作成した後、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;
}
}

私の間違いが何かわかるかもしれません... - コード形式の何が問題なのですか?!

セグフォルトを修正するのに助けが必要です-残りは問題ないはずです(私は思います;))

こんにちは!

4

1 に答える 1

2

いくつかの問題があります。1つ目は、Martin Jamesが述べたように、より大きなスタックサイズが必要です。私は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でした​​)。

それはそれを修正する必要があります。

于 2012-05-08T00:04:32.470 に答える