groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Groff] grohtml - "too many open files"


From: Ralph Corderoy
Subject: Re: [Groff] grohtml - "too many open files"
Date: Fri, 01 Dec 2006 12:28:09 +0000

Hi Larry,

> Groff was barfing with a "too many open files" error, which I worked around 
> by doing "ulimit -n 768" first. I ended up with over 640 HTML files. I'm not 
> sure why all every output file has to be open at once, though.

Sounds like either a bug or a design artifact that'll need fixing in the
long run.

>   awk -v stem="$1" '
>     # ...
>     / ... / {
>        grep = "grep -n \"" lasthdg "\" " stem ".ohc";
>        grep | getline ohc;
>      }
>   ' $2-$i.html >> $$.tmp
> 
> I'm also getting a "too many open files" error thrown in this part of the 
> script. 
> Is there any way I can explicitly close the getline pipe, besides looping 
> until it 
> returns 0 for EOF?

Yes, there's close().  IIRC awk doesn't close a file or pipe even when
you reach EOF so it's up to you to close it yourself.  Further, if the
command is the same as previously, you must close it in order to get a
new command to run:

    $ cat t
    BEGIN {
        "d=`date`; echo 1 $d; echo 2 $d" | getline foo
        "sleep 2" | getline snooze
        "d=`date`; echo 1 $d; echo 2 $d" | getline bar
        print foo "," snooze "," bar
        exit
    }
    $ awk -f t
    1 2006-12-01 12:22:27 +0000 Fri,,2 2006-12-01 12:22:27 +0000 Fri
    $

foo and bar are both read from the one command that's run, hence the
date not changing and the line numbers progressing.  However,

    $ cat u
    BEGIN {
        "d=`date`; echo 1 $d; echo 2 $d" | getline foo
        close("d=`date`; echo 1 $d; echo 2 $d")
        "sleep 2" | getline snooze
        close("sleep 2")
        "d=`date`; echo 1 $d; echo 2 $d" | getline bar
        close("d=`date`; echo 1 $d; echo 2 $d")
        print foo "," snooze "," bar
        exit
    }
    $ awk -f u
    1 2006-12-01 12:24:43 +0000 Fri,,1 2006-12-01 12:24:45 +0000 Fri
    $

What status close() returns depends on your awk.  And closing a pipe
should wait for the command to finish so if you've a grep that produces
1E6 lines and you just want to read the first then pipe it into `sed 1q'
before reading it into awk so the grep gets a SIGPIPE on writing to the
finished sed, curtailing its largess.

Cheers,


Ralph.






reply via email to

[Prev in Thread] Current Thread [Next in Thread]