2016-02-23 5 views
0

Я работаю над проектом с 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

ответ

0

Основной причиной является то, что в программе нескольких потоков, чтобы возвращение sigsuspend, мы должны блокировать все другие потоки с указанным сигналом. Однако в golang мы не можем настроить сигмас потоков управления golang.

Пожалуйста, обратитесь к следующей ссылке для получения детальной информации

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

 Смежные вопросы

  • Нет связанных вопросов^_^