0
我正在與golang一起開發項目。該項目調用LSF的C API(作業調度程序https://en.wikipedia.org/wiki/Platform_LSF)。一些API在與LSF系統通信時調用sigsuspend()。通過cgo通過golang程序調用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)
}
}
由於
庸