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

Kdb 在同一端口上重新打开连接会导致错误的文件描述符句柄,kdb,Kdb,我有一个proc,它在端口2600上生成一个子进程。它使用句柄6连接到进程,提取一些数据,终止进程,然后在同一端口上启动另一个子进程,我连接到它,当我尝试在句柄上运行命令时,我得到以下错误: 'Cannot write to handle 6. OS reports: Bad File Descriptor 进程正在运行,我可以手动连接到它并获取数据。我有一个跟踪连接的表,我可以看到第二次生成子进程时的句柄也是6。关于为什么会发生这种情况有什么建议吗 更新:只是想说明一下。当我关闭句柄时,我会

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

'Cannot write to handle 6. OS reports: Bad File Descriptor
进程正在运行,我可以手动连接到它并获取数据。我有一个跟踪连接的表,我可以看到第二次生成子进程时的句柄也是6。关于为什么会发生这种情况有什么建议吗

更新:只是想说明一下。当我关闭句柄时,我会向proc发送一条带有“exit 1”的异步消息。这可能是因为进程在我打开连接之前没有被终止,之后被终止,然后我认为新进程只是旧进程的一个garrbage句柄,现在已经不存在了

更新:在发送“退出1”后,我确实刷新了句柄,新进程似乎开始正常。我可以看到新进程在进程上运行(它们有不同的名称)

更新:即使连接成功,句柄也不会添加到.z.W。因此句柄不会出现在.z.W中


更新:发现问题。我正在使用的.IPC.SCON函数,我认为它只是一个简单的错误陷阱包装器。。。具有检查同一hst:prt的缓存句柄表的逻辑,并获取该句柄而不是打开另一个。因为我的进程运行在同一个主机:端口上,所以它使用了旧的缓存句柄,而不是再次打开它。谢谢大家的帮助。

您使用的是什么版本的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
更新:如果看不到您的代码或执行顺序,就很难找出问题所在。如果在尝试启动新进程之前未终止进程,则会看到一个
地址已在使用中
错误。如果尝试连接时进程未启动,则会看到
'hop
错误,这意味着hopen失败。 此外,异步消息不会立即发送,因此根据代码的执行顺序,您可能需要刷新异步“退出”消息,但正如我提到的,如果在尝试启动另一个子进程时原始子进程仍处于运行状态,则会出现地址冲突

更新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)

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

运行3.6 L64在我的原始回复中添加了更新发送“退出1”后,在父端添加显式的
hclose句柄
在冲洗完你的皮肤后,直到没有运气为止。句柄似乎没有添加到.z.W。使用相同的端口可能会有问题?可能端口未及时释放以进行新连接。还不知道,我明白了。您是在使用香草
hopen
函数还是使用某种包装器/受保护的eval?对于打开连接,我使用的是
@[hopen;x;0Ni]
其中x是(主机:端口;超时),您确定受保护的eval没有返回null int吗?在第二次调用hopen之后,您是否正在修改handle变量?我在下面的回复中添加了另一个更新,可能是这样吗?为了调试的目的,我会临时将上述内容更改为
@[hopen;x]