Memory
#include <sharedmem.h>
#include <sharedmem_jni.h>
Summary
Functions |
|
---|---|
ASharedMemory_create(const char *name, size_t size)
|
int
Create a shared memory region.
|
ASharedMemory_dupFromJava(JNIEnv *env, jobject sharedMemory)
|
int
Returns a dup'd FD from the given Java android.os.SharedMemory object.
|
ASharedMemory_getSize(int fd)
|
size_t
Get the size of the shared memory region.
|
ASharedMemory_setProt(int fd, int prot)
|
int
Restrict access of shared memory region.
|
Functions
ASharedMemory_create
int ASharedMemory_create( const char *name, size_t size )
Create a shared memory region.
Create a shared memory region and returns a file descriptor. The resulting file descriptor can be mapped into the process' memory using mmap(2) with PROT_READ | PROT_WRITE | PROT_EXEC
. Access to shared memory regions can be restricted with ASharedMemory_setProt.
Use close(2) to release the shared memory region.
Use android.os.ParcelFileDescriptor to pass the file descriptor to another process. File descriptors may also be sent to other processes over a Unix domain socket with sendmsg(2) and SCM_RIGHTS
. See sendmsg(3) and cmsg(3) man pages for more information.
If you intend to share this file descriptor with a child process after calling exec(3), note that you will need to use fcntl(2) with F_SETFD
to clear the FD_CLOEXEC
flag for this to work on all versions of Android.
Available since API level 26.
Details | |||||
---|---|---|---|---|---|
Parameters |
|
||||
Returns |
file descriptor that denotes the shared memory; -1 and sets
errno on failure, or -EINVAL if the error is that size was 0. |
ASharedMemory_dupFromJava
int ASharedMemory_dupFromJava( JNIEnv *env, jobject sharedMemory )
Returns a dup'd FD from the given Java android.os.SharedMemory object.
The returned file descriptor has all the same properties & capabilities as the FD returned from ASharedMemory_create(), however the protection flags will be the same as those of the android.os.SharedMemory object.
Use close() to release the shared memory region.
Available since API level 27.
Details | |||||
---|---|---|---|---|---|
Parameters |
|
||||
Returns |
file descriptor that denotes the shared memory; -1 if the shared memory object is already closed, if the JNIEnv or jobject is NULL, or if there are too many open file descriptors (errno=EMFILE)
|
ASharedMemory_getSize
size_t ASharedMemory_getSize( int fd )
Get the size of the shared memory region.
Available since API level 26.
Details | |||
---|---|---|---|
Parameters |
|
||
Returns |
size in bytes; 0 if
fd is not a valid shared memory file descriptor. |
ASharedMemory_setProt
int ASharedMemory_setProt( int fd, int prot )
Restrict access of shared memory region.
This function restricts access of a shared memory region. Access can only be removed. The effect applies globally to all file descriptors in all processes across the system that refer to this shared memory region. Existing memory mapped regions are not affected.
It is a common use case to create a shared memory region, map it read/write locally to intialize content, and then send the shared memory to another process with read only access. Code example as below (error handling omited).
int fd = ASharedMemory_create("memory", 128);
// By default it has PROT_READ | PROT_WRITE | PROT_EXEC.
size_t memSize = ASharedMemory_getSize(fd);
char *buffer = (char *) mmap(NULL, memSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
strcpy(buffer, "This is an example."); // trivially initialize content
// limit access to read only
ASharedMemory_setProt(fd, PROT_READ);
// share fd with another process here and the other process can only map with PROT_READ.
Available since API level 26.
Details | |||||
---|---|---|---|---|---|
Parameters |
|
||||
Returns |
0 for success, -1 and sets
errno on failure. |