Unix 为什么我必须删除[关闭频道]?

Unix 为什么我必须删除[关闭频道]?,unix,ocaml,channel,Unix,Ocaml,Channel,我编写了用ocaml发送消息的代码 let out_channel = Unix.out_channel_of_descr sockfd in Marshal.to_channel out_channel message []; flush out_channel; close_out out_channel 然而,我得到了警告 GLib-WARNING **: poll(2) failed due to: Bad file descriptor. 我知道该警告是由于[close_

我编写了用ocaml发送消息的代码

 let out_channel = Unix.out_channel_of_descr sockfd in
 Marshal.to_channel out_channel message [];
 flush out_channel;
 close_out out_channel
然而,我得到了警告

 GLib-WARNING **: poll(2) failed due to: Bad file descriptor.

我知道该警告是由于[close_out_channel]引起的,当我从代码中删除[close_out_channel]时,我没有收到该警告。我不知道为什么我必须删除[关闭频道]。您能告诉我原因吗?

您正在从sockfd制作一个OCaml频道。当您关闭通道时,即关闭sockfd。这将混淆创建的任何层。所以在那之后事情就出了问题。负责sockfd的人也负责关闭它。我认为,只需删除
close\u out\u channel
实际上是正确的做法。但是
flush out\u channel
很好。

那么,你的意思是当我用错误的代码关闭\u channel时,我正在关闭socket?是的,尽管我想我不是很清楚。我会重写一点,谢谢。我将等待您的答复。很抱歉,答复太晚。我读了你编辑的答案。我明白了。非常感谢你!