ここでは達成したいことがあります。 threadRoutineフォークされたプロセスのスレッドは、コメントで示される特定のポイントからの実行を開始するだけです//フォークされたプロセスのスレッドはここからから実行を開始する必要があります。私は元のスタックのために同じメモリ領域を使用します。threadRoutine。しかし、私はフォークプロセスのthreadRoutineは私が1にcp_threadを設定するようlongjmpのを実行しないので、そのスタックは元のプロセスのthreadRoutineから分岐し始め、私が意図したところそれがジャンプすることはできませんと思われます。私はこの問題を解決するにはどうすればよい分岐したプロセスからのlongjmp
は、それはフォークプロセスのlongjmpをのprecenceに元のスタックやフォークプロセスのthreadRoutineを発散していないです。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <setjmp.h>
pthread_attr_t attr;
int cp_thread = 0;
static jmp_buf buf;
pthread_barrier_t bar;
void make_jmp_if_req()
{
if (cp_thread)
longjmp(buf, 1);
}
void *threadRoutine(void *threadMsg)
{
size_t myStackSize;
void *stackAddr;
make_jmp_if_req();
printf("%d: TR:{stackAddr pointer = %lx, @threadRoutine = %lx}\n",
getpid(), stackAddr, threadRoutine);
pthread_attr_getstack(&attr,&stackAddr,&myStackSize);
setjmp(buf);
pthread_barrier_wait(&bar);
printf("%d: TR:stack address %p\n", getpid(), stackAddr);
printf("%d: TR:stack size is %x\n", getpid(), myStackSize);
//printf("%d\n",*((int *)stackAddr)); // <--------------------Causing segmentation fault..
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
size_t stacksize;
void *stackAddr;
int rc;
size_t i;
pthread_t thread;
pid_t pid;
pthread_attr_init(&attr);
// So that setjmp in the threadRoutine of the orignal process is called before
// longjmp from threadRoutine of the forked process.
pthread_barrier_init(&bar, NULL, 2);
stacksize = 0xC00000; //12582912;
stackAddr = malloc(stacksize);
printf("Main:{stackAddr = %lx}\n", stackAddr);
pthread_attr_setstack(&attr,stackAddr, stacksize);
pthread_attr_getstack(&attr,&stackAddr, &stacksize);
printf("Main:stack address %p\n",stackAddr);
printf("Main:stack size is %x\n",stacksize);
rc = pthread_create(&thread, &attr, threadRoutine, (void*)0);
pthread_barrier_wait(&bar);
switch(pid = fork())
{
case -1:
printf("fork failed");
break;
case 0: // Child
printf("Child pid() = %d\n", getpid());
cp_thread = 1;
rc = pthread_create(&thread, &attr, threadRoutine,(void *)0);
break;
default:// Leader
printf("Parent pid() = %d\n", getpid());
//rc = pthread_create(&thread, &attr, threadRoutine,(void *)0);
}
if(rc)
{
printf("ERROR:return code from pthread_create %d\n",rc);
exit(-1);
}
pthread_exit(NULL);
}
「あなたはこれを使わないと言って、違うことをしてはいけません」と言うと、人々はあなたの質問に答えないように頼んでいます。役に立つ答えが必要な場合は、「運動」を提示するのではなく、実際に何をしようとしているのかを見せてください。 – larsks