linux平台上C#中的自定义posix信号不起作用 问题:

linux平台上C#中的自定义posix信号不起作用 问题:,c#,c++,linux,.net-core,signals,C#,C++,Linux,.net Core,Signals,我试图在linux中向linux中dotnet core中的C#线程发送一个信号。我的测试代码可以使用SIGARAM,但不能使用到SIGRTMIN#的自定义信号映射sigwait永远不会返回 C++版本运行良好。C++和C版本几乎是相同的。有人能找出它为什么不起作用吗 我的最终目标是捕捉设备驱动程序发出的信号 C++版本 //https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/sigwaiti.htm //g++-Wall-O2 e

我试图在linux中向linux中dotnet core中的C#线程发送一个信号。我的测试代码可以使用SIGARAM,但不能使用到SIGRTMIN#的自定义信号映射<当主线程发出自定义信号时,线程上的code>sigwait永远不会返回

C++版本运行良好。C++和C版本几乎是相同的。有人能找出它为什么不起作用吗

我的最终目标是捕捉设备驱动程序发出的信号

C++版本
//https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/sigwaiti.htm
//g++-Wall-O2 example.cpp-o example-pthread
#包括
#包括
#包括
#包括
#包括
#包括
空隙捕捉器(内部信号){
printf(“为信号%d\n调用的信号捕捉器”,sig);
}
无效时间戳(const char*str){
时间;
时间&t;
printf(“时间%s是%s\n”,str,ctime(&t));
}
在_sigusr1(int sig)上无效
{
//注意:通常情况下,在一个数据库中调用几乎所有的库函数是不安全的
//信号处理器,因为信号可能是在
//调用该函数。
printf(“收到SIGUSR1!\n”);
}
#定义SIG_系统(SIGRTMIN+7)
无效运行()
{
struct-sigaction-sigact;
sigset_t waitset;
siginfo_t info;
sigemptyset(&sigact.sa_mask);
sigact.sa_标志=0;
sigact.sa_handler=catcher;
sigaction(SIG_系统和sigaction,NULL);
sigemptyset(&waitset);
sigaddset(和waitset,SIG_系统);
sigprocmask(SIG_块和等待集,NULL);
时间戳(“在sigwaitinfo()之前”);
//int result=sigwaitinfo(&waitset,&info);
int-sig;
int result=sigwait(&waitset,&sig);
if(sig==sig_系统)
printf(“为信号%d返回了sigwaitinfo()”\n“,
信息(SIU signo);
否则{
printf(“sigwait()sig%d\n”,sig);
printf(“sigwait()返回代码%d\n”,结果);
printf(“sigwait()返回错误号%d\n”,errno);
perror(“sigwait()函数失败\n”);
}
时间戳(“在sigwaitinfo()之后”);
}
int main(int argc,char*argv[]){
int结果=0;
信号(SIG_系统和on_sigusr1);
sigset_t waitset;
sigemptyset(&waitset);
sigaddset(和waitset,SIG_系统);
sigprocmask(SIG_块和等待集,NULL);
std::线程tx(运行);
睡眠(5);
//警报(5);
//结果=上升(SIG_系统);
结果=kill(getpid(),SIG_系统);
printf(“杀死(%d)%d\n”,信号系统,结果);
tx.join();
返回(结果);
}
C版本 然而,C#中的测试程序不起作用

使用系统;
使用静态Tmds.Linux.LibC;
使用Tmds.Linux;
使用System.Runtime.InteropServices;
委托无效信号回调(int sig);
名称空间示例
{
班级计划
{
静态空隙捕集器(int sig)
{
WriteLine($“调用信号{sig}的信号捕获器”);
}
静态无效时间戳(字符串str)
{
WriteLine($“时间{str}是{DateTime.Now}”);
}
静态系统。线程。线程;
静态int SIG_系统=SIGRTMIN+7;
静态不安全的无效运行()
{
int结果=0;
sigaction sigact=新的sigaction();
sigset_t waitset=新sigset_t();
siginfo_t info=新siginfo_t();
sigset_t*ptr=&sigact.sa_掩码;
sigemptyset(&sigact.sa_mask);
sigact.sa_标志=0;
SignalCallback=新的SignalCallback(捕捉器);
sigact.sa_handler=(void*)Marshal.GetFunctionPointerForDelegate(回调);
sigaction(SIG_系统和sigaction,null);
sigemptyset(&waitset);
sigaddset(和waitset,SIG_系统);
sigprocmask(SIG_块和等待集,null);
时间戳(“在sigwaitinfo()之前”);
//结果=sigwaitinfo(&waitset,&info);
int-sig;
结果=sigwait(&waitset,&sig);
//非托管代码上次使用后
GC.KeepAlive(回调);
if(sig==sig_系统)
WriteLine($“sigwaitinfo()为信号{info.si_signo}返回);
其他的
{
WriteLine($“sigwait()sig{sig}”);
WriteLine($“sigwait()返回代码{result}”);
WriteLine($“sigwait()返回错误号{errno}”);
WriteLine(“sigwait()函数失败”);
}
时间戳(“在sigwaitinfo()之后”);
}
静态不安全void Main(字符串[]args)
{
sigset_t waitset=新sigset_t();
sigemptyset(&waitset);
sigaddset(和waitset,SIG_系统);
sigprocmask(SIG_块和等待集,null);
线程=新系统.Threading.Thread(运行);
Thread.Start();
//警报(10);
睡眠(5);
int result=kill(getpid(),SIG_系统);
WriteLine($“kill({SIG_SYSTEM}){result}”);
Thread.Join();
}
}
}
环境
  • VisualStudio专业版2019 16.9.4
  • dotnet核心SDK 3.1
  • WSL上的Ubuntu
  • Tmds.Linux 0.5.0