小编Sy.*_*y.Z的帖子

cgo如何处理信号?

我遇到了Go程序使用.so lib的问题,而c代码需要处理SIGALRM信号.但似乎一旦信号SIGALRM发布,程序就会崩溃.从"The Go Programming Language"我看到:

如果非Go代码安装任何信号处理程序,则必须使用带有sigaction的SA_ONSTACK标志.如果未收到信号,则可能导致程序崩溃.

任何人都可以通过sigaction显示SA_ONSTACK标志的用法.我非常感激.

以下是我的代码:

// LIC_TIMER_CALLBACK_FUNC is a function pointer

static LIC_TIMER_CALLBACK_FUNC s_pfnTmCallBack;

static void _OS_TriggerTask(int iSig)
{
    logInfo("_OS_TriggerTask start...");
    if (LIC_NULL_PTR != s_pfnTmCallBack)
    {
        logInfo("call timer callback...");
        s_pfnTmCallBack(0);    
    }
    logInfo("_OS_TriggerTask end...");
}

// set the trigger
int OS_StartTrigger(int ulLength, LIC_TIMER_CALLBACK_FUNC pfnTmCallBack)
{    
    logInfo("OS_StartTrigger start...");

s_pfnTmCallBack = pfnTmCallBack;

struct sigaction stSigact; 

stSigact.sa_handler = _OS_TriggerTask;
stSigact.sa_flags   = SA_ONSTACK;
sigemptyset(&stSigact.sa_mask);
int iRet = sigaction(SIGALRM, &stSigact, NULL);

if(0 != iRet)
{
    logError("set signal failed...");
}
else
{
    logInfo("set signal …
Run Code Online (Sandbox Code Playgroud)

go cgo

9
推荐指数
1
解决办法
607
查看次数

标签 统计

cgo ×1

go ×1