1. Create/acquire a shared memory
#include <sys/mman.h> #include <sys/stat.h>/ * for Mode constants */#include <fcntl.h>/ * for O_* Constants */int Shm_open (const char *name, int oflag, mode_t mode);
Parameters:
Name: Shared memory names;
Oflag: With the Open function type, can be o_rdonly, o_wronly, O_RDWR, can also be bitwise OR on o_creat, O_EXCL, O_trunc.
mode: This parameter always needs to be set, if Oflag does not specify O_creat, mode can be set to 0;
return value:
Success: Returns a file descriptor;
Failure: return-1;
Note-posix IPC Name limitations:
1. Must start with "/", and can not be followed by "/", shape such as:/file-name;
2. Name length cannot exceed Name_max
3. When linking: Link WITH-LRT.
/** Example: Open and close shared memory **/int main (int Argc,char *argv[]) { int shmid = Shm_open ("/xyz", o_rdwr| O_creat, 0666); if (Shmid = =-1) err_exit ("Shmget error"); cout << "Share memory Open success" << Endl; Close (Shmid);}
2. Modify the shared memory size
int ftruncate (int fd, off_t length);
This function can be used not only to modify the shared memory size, but also to modify the file size
/** Example: Modify the shared memory size to modify it to a size of Student struct **/struct student{ char name[32]; int age;}; int main (int argc,char *argv[]) { int shmid = Shm_open ("/xyz", o_rdwr| O_creat, 0666); if (Shmid = =-1) err_exit ("Shmget error"); if (Ftruncate (Shmid, sizeof (Student)) = =-1) err_exit ("Ftruncate error"); cout << "Share memory change size success" << Endl; Close (Shmid);}
3. Get Shared Memory status
int fstat (int fd, struct stat *buf);
This function can not only be used to get the shared memory state, but also can be used to get the file state, with the stat, Lstat type, as previously described;
/** Example: Get the shared memory mode and size **/int main (int Argc,char *argv[]) { int shmid = Shm_open ("/xyz", o_rdwr| O_creat, 0666); if (Shmid = =-1) err_exit ("Shmget error"); if (Ftruncate (Shmid, sizeof (Student)) = =-1) err_exit ("Ftruncate error"); struct stat buf; if (Fstat (Shmid, &buf) = =-1) err_exit ("Lstat error"); Note: When getting permissions, you need to & 0777, and you want to print printf in%o, octal mode ("mode:%o\n", buf.st_mode&0777); printf ("Size:%ld\n", buf.st_size); Close (Shmid);}
4. Delete a shared memory object
int Shm_unlink (const char *name);
Example: int main (int argc,char *argv[]) { shm_unlink ("/xyz");}
5. Mapping/offloading of shared memory
#include <sys/mman.h>void *mmap (void *addr, size_t length, int prot, int flags, int fd, off_t offset); int Munmap (voi D *addr, size_t length);
Parameters:
Addr: The starting address to be mapped, usually specified as NULL, allowing the kernel to be automatically selected;
Length: The number of bytes mapped to the process address space, usually the size of the shared memory that was previously created;
Prot: Map Area protection method (see below);
Flags: flags (usually specified as map_shared for interprocess communication);
FD: File descriptor (filled with the shared memory ID returned by Shm_open);
offset: Offsets from the beginning of the file header (typically filled with 0);
Prot |
Description |
Prot_read |
Page readable |
Prot_write |
Pages can be written |
Proc_exec |
Page executable |
Proc_none |
Page not accessible |
Flags |
Description |
Map_shared |
The change is shared |
Map_private |
The change is private. |
Map_fixed |
Explain the addr parameter exactly, and if you do not specify this parameter, it will be aligned with memory of 4 K size |
Map_anonymous |
Create an anonymous map area that does not involve files |
Mmap return Value:
Success: Returns the starting address of the memory area mapped to;
failure: return map_failed;
Note: Mmap failed to return the cause of the eacces error:
eacces A file descriptor refers to A non-regular file.
Or Map_private was requested, and FD is not open for reading.
Or map_shared was requested and Prot_write are set, but FD are not open
In Read/write (o_rdwr) mode. Or prot_write is set, and the file is append-only.
/** read data from shared memory **/int main (int Argc,char *argv[]) { int shmid = Shm_open ("/xyz", o_rdonly, 0); if (Shmid = =-1) err_exit ("Shm_open error"); struct stat buf; if (Fstat (Shmid, &buf) = =-1) err_exit ("Fstat error"); Student *p = (Student *) mmap (NULL, Buf.st_size, prot_read, map_shared, Shmid, 0); if (p = = map_failed) err_exit ("mmap error"); cout << "Name:" << p->name << ", Age:" << p->age << Endl; Munmap (P, buf.st_size); Close (Shmid);}
Attached
-posix shared memory is created by default in the/DEV/SHM directory
-You can use the OD command to view the contents of shared memory
Od-c/dev/shm/xyz
Linux IPC Practice (TEN)--posix shared memory