Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Difference between File Handles and File Descriptors in function parameters.

by armstd (Friar)
on Aug 11, 2011 at 18:23 UTC ( #919926=note: print w/ replies, xml ) Need Help??


in reply to Difference between File Handles and File Descriptors in function parameters.

One downside I can think of here is, if you accept a passed-in filehandle, and use it directly, then your method will be altering the file position of the caller's handle. Your method will also be subject to the current position and any settings on the caller's filehandle, so "printRestOfFile()" might be a more accurate name than "printfile()" for your sub as shown.

By accepting a descriptor, you would then make your own handle, with whatever settings that are appropriate for your method, only affecting your method, not the caller. This becomes much more of a concern when you're abstracting something, rather than just creating a worker sub for a structured script. Do no harm to your caller and all that.

--Dave


Comment on Re: Difference between File Handles and File Descriptors in function parameters.
Re^2: Difference between File Handles and File Descriptors in function parameters.
by tchrist (Pilgrim) on Aug 14, 2011 at 19:36 UTC
    One downside I can think of here is, if you accept a passed-in filehandle, and use it directly, then your method will be altering the file position of the caller's handle.

    Thatís not a bug, itís a feature!

    It has to work this way, because otherwise you will get mangled I/O. It is critical that the seek points be the same or else you get overwrites and duplicate reads on seekable devices. You will also incur behavioral differences between running on nonseekable devices like sockets, pipes, and ttys then when running on seekable devices like disk files. Completely misery and chaos would ensue.

    Never assume that you alone have the sole copy of a particular kernel file descriptor. If you are relying on that, you are almost certainly broken in some way. Passed in descriptors are quite possibly duplicated in another process; with the std streams, this is virtually guaranteed.

    In fact, even if you open a file yourself, you cannot know you have the only copy because you cannot guarantee that you are not yourself a clone, since any function that you call after the open is welcome to fork itself an identical process. You cannot know you are who you think you are ó or least, not easily.

    Welcome to Unix, and have a nice day.

    --tom

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (11)
As of 2014-09-18 22:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (125 votes), past polls