繁体   English   中英

在tcl中,如何在不关闭父级的情况下从派生子级关闭dp_MakeRPCClient创建的套接字/通道

[英]In tcl, how to close a socket/channel created by dp_MakeRPCClient from forked child without closing it in the parent

我正在使用Tcl-DP在tcl中的两个进程之间进行通信。 我创建使用服务器dp_MakeRPCServer上一个PROCESSS和使用其它工艺客户dp_MakeRPCClient 创建客户端后,它将连接到服务器,并在两个进程之间创建一个新的套接字。

第一步

dp_MakeRPCServer 50000
file channel
> stdin stdout stderr tcp0

第二道工序

dp_MakeRPCClient <host> 50000
file channel
> stdin stdout stderr tcp0

第一步

file channel
> stdin tcp2 stdout stderr tcp0

我们可以看到,第一个进程中的tcp2是套接字。 现在,我正在执行fork,并将通道克隆到该子级中。

子进程(从第一个进程派生)

file channel
stdin tcp2 stdout stderr tcp0

我想在不关闭第一个和第二个进程之间的套接字的情况下关闭子进程上的tcp2 (套接字)。

close tcp2只会在第一个进程和第二个进程中关闭子进程中的套接字。

我还将接受考虑以下因素的任何其他建议:

  • 任何时候,其他进程都可能尝试连接到第一个进程的服务器。 我不希望子进程接听这些电话。
  • 在任何时候,第二进程都可以开始向第一进程发送消息。 同样,我不希望子进程接收那些消息。

我应该提到我正在使用TclDp 4.0和tcl 8.4。

以下要求您首先阅读套接字常见问题 ,但这是关键:

通常, close()shutdown()之间的区别是: close()关闭该进程的套接字ID,但是如果另一个进程共享此套接字ID,则连接仍然打开。 连接保持打开状态以供读取和写入,有时这非常重要。 shutdown()断开共享套接字ID的所有进程的连接。 尝试读取的人将检测到EOF ,而尝试写入的人将重新获取SIGPIPE ,可能会在内核套接字缓冲区被填充时延迟。 此外, shutdown()还有第二个参数,该参数指示如何关闭连接:0表示禁用进一步读取,1表示禁用写入,2禁用两者。

在Unix上,除非您要求关闭特定方向(Tcl 8.6功能),否则套接字上的Tcl close命令将映射到具有标准套接字实现的套接字上的close()系统调用,在这种情况下, shutdown()将使用系统调用。 这意味着对于标准套接字,如果在派生之前在父进程中打开套接字,则父进程应在分叉后close套接字。 (让两个进程同时从同一个TCP套接字读取数据通常不是一个好主意;事情变得非常混乱。)

但是, TclDP使用自己的套接字通道实现,该实现仅支持通过 Unix 上的close()系统调用进行close() (我没有在Windows上检查过;我在那里不太了解系统API。)

就是说,我希望子进程中的close tcp2能够工作,前提是父进程仍然打开套接字。 在这方面,Tcl实际上只是公开了操作系统的功能。 它不会做任何特殊的事情来使孩子的亲子关系影响父母。

也可以看看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM