- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 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/
sigsuspend 更改信号掩码,暂停调用线程的执行,直到它接收到“其 Action 是执行信号捕获函数或终止进程的信号”,然后(如果进程没有终止并且信号处理程序返回)将信号掩码恢复到其原始状态。
根据 sigsuspend() 的手册页,它将用第一个参数替换当前信号掩码集。在APUE中,我看到了一个例子如下。代码可能有点太长了,但我不想错过任何东西。 int pr_mask(char *s)
长话短说,我有来自同一个可执行文件的两个进程。它们旨在相互通信并为这些进程前面的用户创建聊天。称它们为p1,p2; p1 会更快地输入初始详细信息(例如名称),因此它必须等到 p2 执行同样的操作。这
我试图同步父亲和 child ,下面的代码不起作用(显然 usr_interrupt++ 不是原子的)。信号量似乎也无济于事。 #include #include #include #inclu
对于家庭作业,我必须只使用 linux 系统调用来管理游戏中的信号,用 C 编程。我必须做的一件事是在 thread 中无限期调用 sigsuspend 并等待 SIGALRM,然后如果有 sigal
我的目标是使主进程与其“ fork ”子进程相互通信。通信是通过信号传递完成的。 当第一个 child 在等待 SIGUSR1 信号时卡住等待时,我的问题就出现了。 我真的不知道为什么它会卡在这一点上
假设有两个进程,一个父进程和一个子进程,它们使用信号进行同步。在父进程中,用于与子进程同步的函数如下所示。 WAIT_CHILD(){ while(sigflag == 0){ //sigflag
考虑以下 POSIX 系统的 C 代码: #include #include #include #include #define CONTINUE_SIGNAL SIGINT void con
我正在阅读有关 Linux x86-64 系统的信号/ECF 的教科书章节(CS:APP,第 3 版,第 8 章,第 781 页),并遇到了这个: The sigsuspend function te
我正在使用 golang 开发一个项目。该项目调用 LSF 的 C API(作业调度程序 https://en.wikipedia.org/wiki/Platform_LSF)。一些 API 在与 L
我正在寻找一个多线程应用程序,其中一个线程在继续之前等待另一个线程发出信号。根据here , sigsuspend 由于竞争条件不是 MT 安全的。根据here , sigwait 应该在这些情况下使
我是一名优秀的程序员,十分优秀!