Format
#include <fcntl.h> #include <sys\stat.h> #include <share.h> #include <io.h> int _sopen(char *pathname, int oflag, int shflag , int pmode);
Language Level: Extension
_sopen opens the file specified by pathname and
prepares the file for subsequent shared reading or writing as
defined by oflag and shflag. The oflag
is an integer expression formed by combining one or more of the
constants defined in <fcntl.h>. When more than one constant
is given, the constants are joined with the OR operator (|).
| Oflag | Meaning |
| O_APPEND | Reposition the file pointer to the end of the file before every write operation. |
| O_CREAT | Create and open a new file. This flag has no effect if the file specified by pathname exists. |
| O_EXCL | Return an error value if the file specified by pathname exists. This flag applies only when used with O_CREAT. |
| O_RDONLY | Open the file for reading only. If this flag is given, neither O_RDWR nor O_WRONLY can be given. |
| O_RDWR | Open the file for both reading and writing. If this flag is given, neither O_RDONLY nor O_WRONLY can be given. |
| O_TRUNC | Open and truncate an existing file to 0 length. The file must have write permission. The contents of the file are destroyed. Do not specify O_TRUNC with O_RDONLY. |
| O_WRONLY | Open the file for writing only. If this flag is given, neither O_RDONLY nor O_RDWR can be given. |
| O_BINARY | Open the file in binary (untranslated) mode. |
| O_TEXT | Open the file in text (translated) mode. (See Stream Processing for a description of text and binary mode.) |
The shflag argument is one of the following constants, defined in <share.h>:
| Shflag | Meaning |
| SH_DENYRW | Deny read and write access to file. |
| SH_DENYWR | Deny write access to file. |
| SH_DENYRD | Deny read access to file. |
| SH_DENYNO | Permit read and write access. |
There is no default value for the shflag.
The pmode argument is required only when you specify O_CREAT. If the file does not exist, pmode specifies the permission settings of the file, which are set when the new file is closed for the first time. If the file exists, the value of pmode is ignored. The pmode must be one of the following values, defined in <sys\stat.h>:
| Value | Meaning |
| S_IWRITE | Writing permitted |
| S_IREAD | Reading permitted |
| S_IREAD | S_IWRITE | Reading and writing permitted. |
If write permission is not given, the file is read-only.
On the OS/2 and Windows operating systems, all files are readable; you cannot give write-only permission. Thus, the modes S_IWRITE and S_IREAD | S_IWRITE are equivalent. Specifying a pmode of S_IREAD is similar to making a file read-only with the ATTRIB system command.
_sopen applies the current file permission mask to pmode before setting the permissions. (See umask -- Sets File Mask of Current Process for information on file permission masks.)
Return Value
_sopen returns a file handle for the opened file. A
return value of -1 indicates an error, and errno is set to one of
the following values:
| Value | Meaning |
| EACCESS | The given path name is a directory, but the file is read-only and an attempt was made to open it for writing, or a sharing violation occurred. |
| EEXIST | The O_CREAT and O_EXCL flags are specified, but the named file already exists. |
| EMFILE | No more file handles are available. |
| ENOENT | The file or path name was not found. |
| EINVAL | An incorrect argument was passed. |
| EOS2ERR | The call to the operating system was not successful. |
Example
This example opens the file sopen.dat for shared reading
and writing using _sopen. It then opens the file for shared
reading.
#include <io.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <share.h>
#define FILENAME "sopen.dat"
int main(void)
{
int fh1,fh2;
printf("Creating file.\n");
system("echo Sample Program > " FILENAME);
/* share open the file for reading and writing */
if (-1 == (fh1 = _sopen(FILENAME, O_RDWR, SH_DENYNO))) {
perror("sopen failed");
remove(FILENAME);
return EXIT_FAILURE;
}
/* share open the file for reading only */
if (-1 == (fh2 = _sopen(FILENAME, O_RDONLY, SH_DENYNO))) {
perror("sopen failed");
close(fh1);
remove(FILENAME);
return EXIT_FAILURE;
}
printf("File successfully opened for sharing.\n");
close(fh1);
close(fh2);
remove(FILENAME);
return 0;
/****************************************************************
The output should be:
Creating file.
File successfully opened for sharing.
****************************************************************/
}
![]()
close -- Close File Associated with Handle
creat -- Create New File
open -- Open File
fdopen -- Associated Input or Output
With File
fopen -- Open Files
_sopen -- Open Shared File
umask -- Sets File Mask of Current
Process
<fcntl.h>
<io.h>
<share.h>
<sys\stat.h>