From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by yquem.inria.fr (Postfix) with ESMTP id DB10ABC69 for ; Sat, 15 Sep 2007 17:57:49 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAAOed60bAXQImh2dsb2JhbACBV4w7AQEBCAQGJw X-IronPort-AV: E=Sophos;i="4.20,258,1186351200"; d="scan'208";a="819985" Received: from discorde.inria.fr ([192.93.2.38]) by mail1-smtp-roc.national.inria.fr with ESMTP; 15 Sep 2007 17:58:31 +0200 Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l8FFw7ur021554 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Sat, 15 Sep 2007 17:58:08 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aj0KAOed60aAArkpaGdsb2JhbACBV4w7CwQGDhk X-IronPort-AV: E=Sophos;i="4.20,258,1186351200"; d="scan'208";a="2743187" Received: from chokecherry.srv.cs.cmu.edu ([128.2.185.41]) by mail3-smtp-sop.national.inria.fr with ESMTP; 15 Sep 2007 17:58:30 +0200 Received: from stratocaster.home (c-71-206-252-35.hsd1.pa.comcast.net [71.206.252.35]) (authenticated bits=0) by chokecherry.srv.cs.cmu.edu (8.13.6/8.13.6) with ESMTP id l8FFwHfG004202 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Sep 2007 11:58:17 -0400 (EDT) Received: from ecc by stratocaster.home with local (Exim 4.67) (envelope-from ) id 1IWa2C-0001S9-Rt for caml-list@inria.fr; Sat, 15 Sep 2007 11:58:16 -0400 Date: Sat, 15 Sep 2007 11:58:16 -0400 From: Eric Cooper To: caml-list@inria.fr Subject: Re: [Caml-list] Closing all open file descriptors Message-ID: <20070915155816.GC3983@stratocaster.home> Mail-Followup-To: caml-list@inria.fr References: <006b01c7f699$275fd6d0$017ca8c0@countertenor> <200709141000.l8EA04x12648@virtutech.se> <1189806728.46eb0288d38b8@webmail.in-berlin.de> <1189847741.46eba2bd9d121@webmail.in-berlin.de> <20070915192631.2384ae5a.mle+ocaml@mega-nerd.com> <1189852990.46ebb73e7edc3@webmail.in-berlin.de> <5fps0k9fp4.fsf@hod.lan.m-e-leypold.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5fps0k9fp4.fsf@hod.lan.m-e-leypold.de> User-Agent: Mutt/1.5.16 (2007-06-11) X-Miltered: at discorde with ID 46EC010F.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; descriptors:01 descriptors:01 fstat:01 fstat:01 readdir:01 readdir:01 unix:01 unix:01 caml-list:01 int:01 int:01 descriptor:02 descriptor:02 descr:02 descr:02 I think the right interface for this should be a "fold" over open file descriptors: open Unix let descr_of_int n = (Obj.magic (n : int) : file_descr) let valid_descr fd = try ignore (fstat fd); true with Unix_error (EBADF, "fstat", _) -> false let fold_open_fds f init = let f' x s = let fd = descr_of_int (int_of_string s) in if valid_descr fd then f x fd else x in Array.fold_left f' init (Sys.readdir "/proc/self/fd") Note that the readdir itself opens a file descriptor, which is included in the result but then closed. So there's a little extra complexity to filter it out so that the caller's function doesn't get applied to a bad descriptor. -- Eric Cooper e c c @ c m u . e d u