gpt4 book ai didi

c - 在c中实现fork()

转载 作者:行者123 更新时间:2023-11-30 17:57:04 24 4
gpt4 key购买 nike

我正在尝试实现一个 fork 函数。该函数将一个线程分成两个。第一个继续执行,而第二个则开始执行 f (被调用函数)和 v (参数)。我的 fork 函数的代码是

void t_fork(ThreadFunc f, any_ptr v, char *name)
{
tcb *currentTcb = malloc(sizeof(tcb));
currentTcb->func= f;
currentTcb->arg= v;
currentTcb->sig=NULL;
strcpy(currentTcb->name,name);
setjmp(currentTcb->context);
q_insert(theadSystem.waitQ,currentTcb);
(*f)(v);
}

我还需要使用生成例程为新线程分配堆栈空间。

在我的代码setjmp中导致错误,我也不知道如何使用spawner为新线程分配空间。

它导致异常:
Threads.exe 中 0xcccccccc 处未处理的异常:0xC0000005:访问冲突。

有人可以帮助解决这些问题吗?

最佳答案

Threads.exe 中 0xcccccccc 处未处理的异常:0xC0000005:访问冲突。 表示您正在 Windows 上运行,您能确认您的环境吗?请注意,将其称为 fork 会让 UNIX 用户感到困惑!

您的内存访问冲突意味着您在某处有一个duff指针,但由于您提供的信息有限,无法判断在哪里。尽管我们不知道 *f 是什么,但您的代码中似乎没有任何地方正在创建线程。您在哪里调用 CreateThread_beginthreadex(假设您使用的是 Windows native 线程)。

您提到了线程、setjmp/longjmp,然后您询问了 spawn,它(在 Windows 上)创建了一个新进程。您使用的是多线程还是多进程?

我刚刚发现您的问题:如何使用 setjmp 和 longjmp 执行从一个进程到另一个进程的上下文切换,答案是不能。 setjmp/longjmp 是一种在进程内跳转的方法,而不是在进程之间跳转,顺便说一句,这是创建内存泄漏的好方法。我会像避免瘟疫一样避免 setjmp/longjmp。

编辑:这是我最好的猜测。我敢打赌你的 tcb block 的名称为:

char * name

并且您只是对其执行strcpy,而不分配任何内存并初始化指针。 strcpy(currentTcb->name,name); 可能会覆盖堆栈指针,从而导致 setjmp 失败。

关于c - 在c中实现fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13015281/

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