Я работаю над проектом с golang. Проект вызывает C API LSF (Планировщик заданий https://en.wikipedia.org/wiki/Platform_LSF). Некоторые из API-интерфейсов вызывают sigsuspend() при общении с системой LSF.sigsuspend не возвращается при вызове программы golang через cgo
Во время теста я обнаружил, что эти API никогда не возвращаются. Но они отлично работают при вызове программы C. Поэтому я пишу простую тестовую программу следующим образом (на основе Go: Get signal origin :-))
Тест-программа подтвердила мои выводы. Он печатает «до sigsuspend» и «Sent by 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)
}
}
Благодаря
Yong