gpt4 book ai didi

c - 来自 fork 进程的longjmp

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:52 33 4
gpt4 key购买 nike

好的,这就是我想要实现的目标。我希望 fork 进程的 threadRoutine 线程仅从特定点开始执行,如注释 //Thread of the forked process should start executing from here 所示。我为原始和 fork 的 threadRoutine 堆栈使用相同的内存区域。但我怀疑,由于 fork 进程的 threadRoutine 执行了 longjmp,因为我将 cp_thread 设置为 1,它的堆栈开始与 <原始进程的 strong>threadRoutine 因此它不能跳到我想要的地方。

我该如何解决这个问题,即不要在 fork 进程的longjmp precence 中将 fork 进程的原始堆栈和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);
}

最佳答案

我认为您的问题与 fork() 不会在子进程中重现线程(存在于调用 fork 的父进程中)这一事实有关。在 fork() 之后,子进程中只存在一个线程。

此外,您应该始终在longjmp 之前调用setjmp,这样您的threadRoutine 就不正确了。当然,您不应该longjmp 进入另一个 线程。

如果没有采取大量预防措施,请不要将线程与 fork 一起使用。了解有关 pthread_atfork 的更多信息。

而且我真的不明白你为什么要这样做。我仍然认为您不应该那样编写代码(或者您没有充分解释为什么要这样做,以及为什么要这样做)。

问候。

关于c - 来自 fork 进程的longjmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931024/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com