|
|
1.1 ! root 1: Shared Memory and How To Use It ! 2: ! 3: ! 4: ! 5: MiNT has a special directory, U:\SHM, which provides a place for ! 6: ! 7: programs to advertise memory that they are offering to share. ! 8: ! 9: To create a shared memory file, a program uses the Fcreate call ! 10: ! 11: to create a file in U:\SHM, e.g.: ! 12: ! 13: ! 14: ! 15: fd = Fcreate("U:\\SHM\\MY.SHARE", 0); ! 16: ! 17: ! 18: ! 19: It then uses an Fcntl call to attach a block of memory (previously ! 20: ! 21: allocated by Malloc or Mxalloc) to the file: ! 22: ! 23: ! 24: ! 25: blk = Malloc(128L); ! 26: ! 27: Fcntl(fd, blk, SHMSETBLK); ! 28: ! 29: ! 30: ! 31: ! 32: ! 33: Several things should be noted when creating a shared memory ! 34: ! 35: file: ! 36: ! 37: ! 38: ! 39: (1) The file's attributes must be 0. Read-only shared memory, or ! 40: ! 41: shared memory with other attributes, is not yet implemented, ! 42: ! 43: but may be in the future. ! 44: ! 45: ! 46: ! 47: (2) Two shared memory files cannot have the same name. An attempt ! 48: ! 49: to create a new shared memory file with the same name as an ! 50: ! 51: existing one will fail with an access denied error (EACCDN). ! 52: ! 53: ! 54: ! 55: (3) Once the block of memory has been attached to the file, it ! 56: ! 57: may be accessed by any application that opens the file. ! 58: ! 59: ! 60: ! 61: (4) A shared memory file (and associated block) remain allocated ! 62: ! 63: even after the program which created it terminates. It can be ! 64: ! 65: deleted (and the associated memory freed) with an Fdelete() ! 66: ! 67: system call. ! 68: ! 69: ! 70: ! 71: (5) The size of the shared memory file will be the actual size ! 72: ! 73: of the memory block. This may be somewhat larger than the ! 74: ! 75: size requested in the Malloc or Mxalloc request, due to memory ! 76: ! 77: rounding. ! 78: ! 79: ! 80: ! 81: ! 82: ! 83: To use a shared memory block, a client application must open ! 84: ! 85: the file and use the SHMGETBLK Fcntl to gain access to it. ! 86: ! 87: For example: ! 88: ! 89: ! 90: ! 91: fd = Fopen("U:\\SHM\\MY.SHARE", 2); ! 92: ! 93: blk = Fcntl(fd, 0L, SHMGETBLK); ! 94: ! 95: Fclose(fd); /* optional -- see below */ ! 96: ! 97: ! 98: ! 99: Things to note: ! 100: ! 101: ! 102: ! 103: (1) The address of the shared memory block is returned by the ! 104: ! 105: Fcntl call. NOTE THAT THIS ADDRESS MAY BE DIFFERENT FOR ! 106: ! 107: DIFFERENT PROGRAMS. That is, a shared memory block that appears ! 108: ! 109: at address 0x01000100 in one program may appear at address ! 110: ! 111: 0x0007f000 in another. In particular, shared memory blocks ! 112: ! 113: should not contain absolute addresses (e.g. pointers). ! 114: ! 115: ! 116: ! 117: (2) The extra argument passed to Fcntl is reserved for future ! 118: ! 119: expansion; use 0L for now to ensure compatibility with ! 120: ! 121: future versions of MiNT. ! 122: ! 123: ! 124: ! 125: (3) The mode argument in the Fopen function must be an accurate ! 126: ! 127: reflection of how the program plans to use the memory; read and ! 128: ! 129: write access permissions will be enforced in future versions ! 130: ! 131: of MiNT. ! 132: ! 133: ! 134: ! 135: (4) If no SHMSETBLK has been made for the file, a SHMGETBLK Fcntl ! 136: ! 137: will return a NULL pointer to indicate an error. ! 138: ! 139: ! 140: ! 141: (5) If a program is finished with a shared memory block and no ! 142: ! 143: longer wishes to use it, it should call Mfree() with the address ! 144: ! 145: of the block (i.e. the address returned by Fcntl(fd, 0L, SHMGETBLK)). ! 146: ! 147: ! 148: ! 149: ! 150: ! 151: Deleting a Shared Memory File ! 152: ! 153: ! 154: ! 155: The Fdelete() system call may be used to delete a shared memory ! 156: ! 157: file. This will *not* necessarily free the associated memory; ! 158: ! 159: the memory will actually be freed only after (1) the file has ! 160: ! 161: been deleted, and (2) all processes using the memory have ! 162: ! 163: freed the memory, either directly or as a result of the process ! 164: ! 165: terminating. ! 166: ! 167: ! 168: ! 169: Fdelete() will fail if the shared memory file is still open. ! 170: ! 171: Processes may omit the Fclose() call if they wish this to happen; ! 172: ! 173: it's a way of informing the process trying to delete the file ! 174: ! 175: that people are still interested in it. Note that it is *not* ! 176: ! 177: harmful to allow the Fdelete to occur, since (as noted above) ! 178: ! 179: the memory will not actually be freed until everyone is finished ! 180: ! 181: with it; but sometimes it may be useful for programs to know that ! 182: ! 183: the memory is still in use. ! 184:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.