
Quoth "Serge D. Mechveliani"
By openFile you, probably, mean openFd.
Yes, sorry!
Another point is the number of open files, for a long loop. ... toA_IO = openFd "toA" WriteOnly Nothing defaultFileFlags ... When applying axiomIO in a loop of 9000 strings, it breaks: "too many open files". I do not understand why it is so, because toA_IO and fromA_IO are global constants (I have not any experience with `do').
toA_IO is a global constant of type "IO Fd", not "Fd". You now see the importance of this distinction - the action actually transpires at "toA <- toA_IO", and each time that executes, you get a new file descriptor.
Anyway, I have changed this to
toA = unsafePerformIO toA_IO fromA = unsafePerformIO fromA_IO ... (I need to understand further whether my usage of unsafePerformIO really damages the project).
It's actually similar to the way some libraries initialize global values, but there are some additional complexities and it isn't clear to me that it's all guaranteed to work anyway. You can read much more about this here: http://www.haskell.org/haskellwiki/Top_level_mutable_state I'm no expert in this, but they're sure here on haskell-cafe, so if you want to take this up, you might start a new topic here, something like "global initialization with unsafePerformIO", describe what you're doing and explain why you can't just pass the open file descriptors as function parameters. ...
Indeed. Initially, I tried C <-> C, and used fgets, fputs, fflush. And it did not work, it required to open/close files inside a loop; I failed with attempts. Again, do not understand, why (do they wait till the buffer is full?).
I don't know. When I was younger, I used to track these problems down and try to explain in detail why buffered I/O is a bad bet with pipes, sockets etc. I don't think anyone listened. I think I am going to experiment with "I am old, so listen to me" and see if it works any better. Donn