gpt4 book ai didi

c - 将信号处理程序添加到线程库的 C 函数中

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:47 25 4
gpt4 key购买 nike

我正在编写一个基本的用户级线程库。创建线程的函数原型(prototype)为
thr_create (start_func_pointer,arg)
{
make_context(context_1,start_func)
}

start_func 将由用户定义并且可以根据用户/程序进行更改

创建线程后一次,如果我开始执行它使用swapcontext(context_1,context_2)

函数 start_func 将开始运行。现在,如果有信号进来,我需要处理它。不幸的是,我只有 start_func 的句柄,所以我不能真正在 start_func 中定义信号 Action

有没有办法在 start_function 中添加信号处理结构并将其指向我的代码。像这样


thr_create (start_func_pointer,arg)
{
start_func.add_signal_hanlding_Structure = my_signal_handler();
make_context(context_1,start_func)
}
有人知道 posix 是怎么做到的吗?

最佳答案

如果您正在谈论从正在运行的实际操作系统捕获真实信号,我相信您将不得不在整个应用程序范围内执行此操作,然后将信号向下传递到每个线程(稍后会详细介绍)。这样做的问题是,如果您的两个(或更多)线程正在尝试使用使用 SIGALRMalarm - 当真正的信号发生时,您可以捕获它,但是您将它交付给谁(一个或所有线程?)。

如果您正在谈论在使用您的库的程序中的线程之间发送和捕获信号,那么向线程发送信号会导致它被标记为准备运行,即使它之前正在等待其他东西,并且然后将从您的线程恢复代码调用任何信号处理功能。如果我记得你之前的问题,你有一个名为 thread_yield 的函数,它被调用以允许下一个线程运行。如果是这种情况,则 thread_yield 需要检查待处理信号列表并执行它们的操作,然后返回到调用过 thread_yield 的位置(除非其中一个信号处理程序涉及终止当前线程,在这种情况下你必须做一些不同的事情)。

至于如何实现信号处理程序的注册,在 POSIX 中,这是由 main 函数(直接或间接)进行的系统调用完成的。所以你可以:

static int foo_flag = 0;

static void foo_handle(int sig) {
foo_flag = 1;
}

int start_func(void * arg) {
thread_sig_register(SIGFOO, foo_handle);

thread_pause();
// this is a function that you could write that would cause the current thread
// to mark itself as not ready to run and then call thread_yield, so that
// thread_pause() will return only after something else (a signal) causes the
// thread to become ready to run again.


if (foo_flag) {
printf("I got SIGFOO\n");
} else {
printf("I don't know what woke me up\n");
}
return 0;
}

现在,您可以从另一个线程向该线程发送一个 SIGFOO(这只是我为了演示目的而编造的一个信号)。

您的每个线程控制 block (或您对它们的任何称呼)都必须有一个信号处理程序表(或列表,或其他)和一个挂起信号列表或一种将信号标记为挂起的方法。挂起的信号将被检查(可能以某种基于优先级的顺序),并在返回到该线程正常代码之前为每个挂起的信号完成处理程序操作。

关于c - 将信号处理程序添加到线程库的 C 函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808132/

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