|
|
#include <sys/sd.h>char *sdget(path, flags, [size, mode]) char *path; int flags, mode; long size;
int sdfree(addr); char *addr;
sdget attaches a shared data segment to the data space of the current process. The actions performed are controlled by the value of flags. flags values are constructed by OR-ing flags from the following list:
sdfree detaches the current process from the shared data segment that is attached at the specified address. If the current process has done sdenter but not an sdleave for the specified segment, sdleave is done before detaching.
When no process remains attached to the segment, the contents of that segment disappear, and no process can attach to the segment without creating it by using the SD_CREAT flag in sdget. errno is set to EEXIST if a process tries to create a shared data segment that exists and is in use. errno is set to ENOTNAM if a process attempts an sdget on a file that exists but is not a shared data type.
For 286 programs, it is strongly recommended that sdget and other shared data functions be reserved for large model programs only. Small or middle model programs that attempt to use shared data may run out of available memory. Also, due to the 286 hardware, it is not possible to enforce the read-only aspect of small model shared data. However, read-only segments are honored in large model programs.
The 386 provides a 32 bit address space, even in small model. As a result, shared data may be conveniently used without regard to the restrictions that apply to 286 programs.
sdget automatically increments the process's original break value to the memory location immediately after the shared data segment. This affects subsequent sbrk or brk calls which attempt to restore the original break value. In particular, attempts to restore the break value to its value before the sdget call causes an error.
This feature is a XENIX specific enhancement and may not be present in all UNIX implementations. This routine must be linked using the linker option -lx.
The size variable in sdget has changed from unsigned to long between UNIX Version 3.0 and UNIX System V. Although this requires that source code be modified to use a long size parameter when compiling with the libraries, an unsigned size parameter is still correctly interpreted by the kernel when passed by binaries compiled with the Version 3.0 libraries.
The mode parameter must be included on the first call of the sdget function.