Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^4: How can I read DATA in parent and child?

by choroba (Cardinal)
on Feb 18, 2019 at 18:18 UTC ( [id://1230123]=note: print w/replies, xml ) Need Help??


in reply to Re^3: How can I read DATA in parent and child?
in thread How can I read DATA in parent and child?

> So I find it surprising that this version works.

It works sometimes . I've run it 10 times and got the following output twice:

Start p p: a Start c stop c p: b p: c p: d p: e stop p

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

Replies are listed 'Best First'.
Re^5: How can I read DATA in parent and child?
by Skeeve (Parson) on Feb 19, 2019 at 07:26 UTC
    It works sometimes.

    As I do an fdopen, I think it should work each time. Infact: I'm just running below code and it's giving me the expected result now the 20th time.

    Here is the (slightly modified) code, which I think should work.

    use IO::Handle; use strict; use warnings; my $pos= tell *DATA; my $pid= fork(); die unless defined $pid; if ($pid == 0) { my $x= IO::Handle->new(); $x->fdopen(fileno(DATA), "r"); seek $x, $pos, 0; print "Start c\n"; sleep 4; while (<$x>) { print "c: $_"; sleep 1; } print "stop c\n"; } else { my $y= IO::Handle->new(); $y->fdopen(fileno(DATA), "r"); seek $y, $pos, 0; print "Start p\n"; while (<$y>) { print "p: $_"; sleep 1; } print "waiting for child\n"; wait; print "stop p\n"; } __DATA__ a b c d e

    s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
    +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
      I've run it 20 times, it returned 15 lines 18 times, but only 10 lines 2 times.
      #!/bin/bash i=1 while : ; do n=$( 1230099.pl | wc -l ) (( n == 15 )) || break printf '%d\r' $((i++)) done echo "$i:$n"

      It stopped after four another iterations with only 10 lines of output.

      map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

        This is really weird…

        I removed the sleep commands and printed the $pos in the start message.

        Both processes tell the same startposition. Nevertheless I also get non-15 lines of output every now and then. 1536 loops were okay, then the parent didn't read any lines.

        My modified 123099.pl code:

        #!/usr/bin/perl use IO::Handle; use strict; use warnings; my $pos= tell *DATA; my $pid= fork(); die unless defined $pid; if ($pid == 0) { my $x= IO::Handle->new(); $x->fdopen(fileno(DATA), "r"); seek $x, $pos, 0; print "Start c $pos\n"; while (<$x>) { print "c: $_"; } print "stop c\n"; } else { my $y= IO::Handle->new(); $y->fdopen(fileno(DATA), "r"); seek $y, $pos, 0; print "Start p $pos\n"; while (<$y>) { print "p: $_"; } print "waiting for child\n"; wait; print "stop p\n"; } __DATA__ a b c d e

        And my modified version of your test-bash:

        #!/bin/bash i=1 while : ; do o=$( ./1230099.pl ) n=$( echo "$o" | wc -l ) (( n == 15 )) || break printf '%d\r' $((i++)) done echo "$i:$n" echo "$o"

        Update I've run it several times now and this is the result:

        2182: 10 1504: 10 560: 10 14: 10 919: 10 360: 10 908: 10 200: 10 65: 10 108: 10 43: 10 105: 10 296: 10 345: 10 100: 10 1084: 10 1278: 10 224: 10 6: 10 8: 10 125: 10 684: 10 96: 10 8: 10 579: 10

        So after an unpredictable amount of iterations (6 to 2182) the scripts prints 10 instead of 15 lines…


        s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
        +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e

        What' even weirder: If I run a sequential verison of the same script, the result is, at least in the last 12104 runs, always correct.

        So it's not in the code it must have to do with perl itself.

        This is the "serialized" code I used:

        #!/usr/bin/perl use IO::Handle; use strict; use warnings; my $pos= tell *DATA; my $x= IO::Handle->new(); $x->fdopen(fileno(DATA), "r"); seek $x, $pos, 0; print "Start c $pos\n"; #sleep 4; while (<$x>) { print "c: $_"; #sleep 1; } print "stop c\n"; my $y= IO::Handle->new(); $y->fdopen(fileno(DATA), "r"); seek $y, $pos, 0; print "Start p $pos\n"; while (<$y>) { print "p: $_"; #sleep 1; } print "stop p\n"; __DATA__ a b c d e

        s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
        +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1230123]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (3)
As of 2024-04-24 13:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found