You are viewing the version of this documentation from Perl 5.005_02. View the latest version
sysopen FILEHANDLE,FILENAME,MODE
sysopen FILEHANDLE,FILENAME,MODE,PERMS

Opens the file whose filename is given by FILENAME, and associates it with FILEHANDLE. If FILEHANDLE is an expression, its value is used as the name of the real filehandle wanted. This function calls the underlying operating system's open() function with the parameters FILENAME, MODE, PERMS.

The possible values and flag bits of the MODE parameter are system-dependent; they are available via the standard module Fcntl. For historical reasons, some values work on almost every system supported by perl: zero means read-only, one means write-only, and two means read/write. We know that these values do not work under OS/390 Unix and on the Macintosh; you probably don't want to use them in new code.

If the file named by FILENAME does not exist and the open() call creates it (typically because MODE includes the O_CREAT flag), then the value of PERMS specifies the permissions of the newly created file. If you omit the PERMS argument to sysopen(), Perl uses the octal value 0666. These permission values need to be in octal, and are modified by your process's current umask. The umask value is a number representing disabled permissions bits--if your umask were 027 (group can't write; others can't read, write, or execute), then passing sysopen() 0666 would create a file with mode 0640 (0666 &~ 027 is 0640).

If you find this umask() talk confusing, here's some advice: supply a creation mode of 0666 for regular files and one of 0777 for directories (in mkdir()) and executable files. This gives users the freedom of choice: if they want protected files, they might choose process umasks of 022, 027, or even the particularly antisocial mask of 077. Programs should rarely if ever make policy decisions better left to the user. The exception to this is when writing files that should be kept private: mail files, web browser cookies, .rhosts files, and so on. In short, seldom if ever use 0644 as argument to sysopen() because that takes away the user's option to have a more permissive umask. Better to omit it.

The IO::File module provides a more object-oriented approach, if you're into that kind of thing.