Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: fileclose
Section: programming/specific
C-Name: gp_fileclose
Prototype: vL
Help: fileclose(n): close the file descriptor n.
Doc: close the file descriptor $n$, created via \kbd{fileopen} or
\kbd{fileextern}. Finitely many files can be opened at a given time,
closing them recycles file descriptors and avoids running out of them:
\bprog
? n = 0; while(n++, fileopen("/tmp/test", "w"))
*** at top-level: n=0;while(n++,fileopen("/tmp/test","w"))
*** ^--------------------------
*** fileopen: error opening requested file: `/tmp/test'.
*** Break loop: type 'break' to go back to GP prompt
break> n
65533
@eprog\noindent This is a limitation of the operating system and does not
depend on PARI: if you open too many files in \kbd{gp} without closing them,
the operating system will also prevent unrelated applications from opening
files. Independently, your operating system (e.g. Windows) may prevent other
applications from accessing or deleting your file while it is opened by
\kbd{gp}. Quitting \kbd{gp} implicitly calls this function on all opened
file descriptors.
On files opened for writing, this function also forces a write of all
buffered data to the file system and completes all pending write operations.
This function is implicitly called for all open file descriptors when
exiting \kbd{gp} but it is cleaner and safer to call it explicitly, for
instance in case of a \kbd{gp} crash or general system failure, which could
cause data loss.
\bprog
? n = fileopen("./here");
? while(l = fileread(n), print(l));
? fileclose(n);
? n = fileopen("./there", "w");
? for (i = 1, 100, filewrite(n, i^2+1))
? fileclose(n)
@eprog Until a \kbd{fileclose}, there is no guarantee that the file on disk
contains all the expected data from previous \kbd{filewrite}s. (And even
then the operating system may delay the actual write to hardware.)
Closing a file twice raises an exception:
\bprog
? n = fileopen("/tmp/test");
? fileclose(n)
? fileclose(n)
*** at top-level: fileclose(n)
*** ^------------
*** fileclose: invalid file descriptor 0
@eprog