gpt4 book ai didi

c# - 在 Mono 中使用 UnixSignal 会引发 System.ArgumentException

转载 作者:行者123 更新时间:2023-12-04 19:02:14 26 4
gpt4 key购买 nike

我有一个控制台应用程序在 Docker 容器中的单声道上运行 .Net 4.6.1,它运行良好。在进一步开发应用程序时,我正在研究使用 Nuget 包 Mono.Posix 响应 unix 信号。 .

根据Mono documentation建议在单独的线程中运行 UnixSignal 处理。

所以我试图像下面的代码那样做:

public void Run()
{
var signalHandler = new Thread(new ThreadStart(ListenToSignal));
signalHandler.Start();
}

private void ListenToSignal()
{
var signals = new List<UnixSignal>() {
new UnixSignal (Mono.Unix.Native.Signum.SIGHUP),
new UnixSignal (Mono.Unix.Native.Signum.SIGINT),
new UnixSignal (Mono.Unix.Native.Signum.SIGQUIT),
new UnixSignal (Mono.Unix.Native.Signum.SIGTERM)
};

int index = UnixSignal.WaitAny(signals.ToArray());
var signal = signals[index].Signum;
Console.WriteLine($"Terminate signal was called: {signal}");
}

启动应用程序时会抛出 ArgrumentException :

Unhandled Exception: System.ArgumentException: Unable to handle signal Parameter name: signum at Mono.Unix.UnixSignal..ctor (Signum signum) <0x40433de0 + 0x00097> in :0 at (wrapper remoting-invoke-with-check) Mono.Unix.UnixSignal:.ctor (Mono.Unix.Native.Signum) at MangoFareScrapingGenericClient.Scraping.ListenToSignal () <0x404339e0 + 0x00117> in :0 at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) <0x7f20f10b1010 + 0x00099> in :0 at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, Boolean preserveSyncCtx) <0x7f20f10af850 + 0x0016e> in :0 at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, Boolean preserveSyncCtx) <0x7f20f10af820 + 0x00020> in :0 at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) <0x7f20f10af770 + 0x00059> in :0 at System.Threading.ThreadHelper.ThreadStart () <0x7f20f10b11d0 + 0x0002e> in :0



如果我在 Github 上查找特定的 code看起来像 signal_infoIntPtr.Zero引发异常。
public UnixSignal (Signum signum)
{
this.signum = NativeConvert.FromSignum (signum);
this.signal_info = install (this.signum);
if (this.signal_info == IntPtr.Zero) {
throw new ArgumentException ("Unable to handle signal", "signum");
}
}

最佳答案

SIGTERMSIGINT 2013 年左右向 Docker 添加了支持(我记得拉取请求,因为我在部署中需要该支持)

所以我是假设 要么 SIGQUITSIGHUP安装失败。

但是 ,因为您没有说哪个信号返回 IntPtr.Zero因此抛出异常,我会尝试自行安装每个信号,以找到您的 Ubuntu Docker 环境不支持的信号。

此时,您可以在直线 C 下测试该信号。程序来确定它是否运行正常,因为它可能是 Mono 中的问题在 Docker 下运行的运行时。

另外,您可以尝试/捕获您的UnixSignal.WaitAny并优雅地降低您的信号处理并编写有关违规信号的日志消息。

关于c# - 在 Mono 中使用 UnixSignal 会引发 System.ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37008911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com