在同一端口上重新打开连接会导致文件描述符句柄错误

reopen a connection on same port results in bad file descriptor handle

我有一个在端口 2600 上生成子进程的进程。它连接到句柄为 6 的进程,提取一些数据,终止进程,然后在同一端口上启动另一个子进程,我连接到它当我尝试 运行 句柄上的命令时,出现以下错误:

'Cannot write to handle 6. OS reports: Bad File Descriptor

进程 运行ning,我可以手动连接到它并获取我的数据。我有一个 table 跟踪连接,我可以看到第二次生成子进程的句柄也是 6。关于为什么会发生这种情况有什么建议吗?

更新:只是为了说清楚。当我关闭句柄时,我使用“exit 1”向 proc 发送一条异步消息。这可能是因为在我打开与它的连接之前该进程没有被杀死,然后被杀死然后我认为它是新进程只是旧的,现在已经不存在的进程的垃圾句柄?

更新:我在发送“exit 1”后刷新句柄,新进程似乎正常启动。我可以在进程上看到新的进程运行ning(他们有不同的名字)

UPDATE:即使认为连接成功,句柄也没有添加到.z.W。所以句柄没有出现在 .z.W

更新:发现问题。我正在使用的 .IPC.SCON 函数,我认为它只是一个错误陷阱的简单包装器......具有逻辑检查缓存句柄的 table 是否相同 hst:prt 并采取那个而不是打开另一个。因为我的进程 运行ning 在同一个 host:port 上,它使用旧的缓存句柄而不是再次打开它。谢谢大家的帮助。

您使用的是什么版本的 kdb?你能运行下面没有问题吗?

KDB+ 4.0 2020.08.28 Copyright (C) 1993-2020 Kx Systems

q)system"q -p 5000";system"sleep 1";h:hopen 5000;0N!h".z.i";neg[h](exit;0)
4475i
q)system"q -p 5000";system"sleep 1";h:hopen 5000;0N!h".z.i";neg[h](exit;0)
4481i
q)system"q -p 5000";system"sleep 1";h:hopen 5000;0N!h".z.i";neg[h](exit;0)
4487i

更新: 在没有看到您的代码或执行顺序的情况下,很难确定问题所在。如果在您尝试启动新进程之前该进程未终止,您将看到 Address already in use 错误。如果在您尝试连接时进程未启动,您将看到 'hop 错误,这意味着 hopen 失败。 此外,异步消息不会立即发送,因此根据代码的执行顺序,您可能需要刷新异步 'exit' 消息,但就像我提到的那样,如果在您尝试启动时原始子进程仍在运行另一个,你会得到一个地址冲突

更新 2: 根据我上面的评论

q)system"q -p 5000"; system"sleep 1"; h:@[hopen;(`::5000;2000);0Ni]; 0N!h".z.i"; neg[h](exit;1)
4365i
q)system"q busy.q -p 5000"; system"sleep 1"; @[hopen;(`::5000;2000);0Ni]; h".z.i"    // hopen times out + handle variable not amended
'Cannot write to handle 4. OS reports: Bad file descriptor
  [0]  system"q busy.q -p 5000"; system"sleep 1"; @[hopen;(`::5000;2000);0Ni]; h".z.i"    // hopen times out + handle variable not amended
                                                                               ^
q).z.W
q)

我认为你在更新中写的是正确的。在您的新进程 运行 之前,该进程正在尝试连接到该端口。 我认为最好的选择是让新启动的进程启动与父进程的连接,这样你就知道它将是 运行 并且不必引入任何睡眠。 另一种选择是尝试在计时器上重新连接,一旦成功连接,将其从计时器中删除并继续您正在尝试做的事情。