gpt4 book ai didi

go - golang 程序通过 cgo 调用 sigsuspend 不返回

转载 作者:数据小太阳 更新时间:2023-10-29 03:27:42 26 4
gpt4 key购买 nike

我正在使用 golang 开发一个项目。该项目调用 LSF 的 C API(作业调度程序 https://en.wikipedia.org/wiki/Platform_LSF)。一些 API 在与 LSF 系统通信时会调用 sigsuspend()。

在测试期间,我发现那些 API 永远不会返回。但它们在被 C 程序调用时工作正常。因此我写了一个简单的测试程序如下(基于Go: Get signal origin :-))

测试程序证实了我的发现。它打印“在 sigsuspend 之前”和“由 xxxx 发送”,但从不打印“在 sigsuspend 之后”。

任何人都可以阐明它吗?如何让这些 API 在 golang 程序中像被 C 程序调用一样工作?

package main

/*
#include <stdio.h>
#include <signal.h>
#include <string.h>

struct sigaction old_action;
void handler(int signum, siginfo_t *info, void *context) {
printf("Sent by %d\n", info->si_pid);
}

void test() {
sigset_t pauseMask;
struct sigaction action;

sigaction(SIGUSR1, NULL, &action);
memset(&action, 0, sizeof action);
sigfillset(&action.sa_mask);
action.sa_sigaction = handler;
action.sa_flags = SA_SIGINFO | SA_ONSTACK;
sigaction(SIGUSR1, &action, &old_action);
sigemptyset(&pauseMask);
printf("before sigsuspend \n");
sigsuspend(&pauseMask);
printf("after sigsuspend \n");
}
*/
import "C"

import (
"os"
"syscall"
"time"
)

/* https://stackoverflow.com/questions/30219751/golang-get-signal-origin */
func main() {
go C.test()
pid := os.Getpid()
for {
syscall.Kill(pid, syscall.SIGUSR1)
time.Sleep(time.Second * 5)
}
}

谢谢

最佳答案

根本原因是在多线程程序中,为了允许 sigsuspend 返回,我们必须阻塞所有其他具有指定信号的线程。但是在golang中,我们无法配置golang管理线程的sigmask。

详细信息请引用以下链接

https://groups.google.com/forum/#!topic/golang-nuts/sYo0iGfkVRg

关于go - golang 程序通过 cgo 调用 sigsuspend 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570265/

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