#include #include #include #include #include #include #include int main (int argc, char* argv []) { char buffer [BUFSIZ]; char* pMap; int fd = open ("MAPPED.FILE", O_CREAT | O_RDWR | O_SYNC, 0666); if (fd == -1) { perror ("open"); return -1; } if (lseek (fd, BUFSIZ - 1, SEEK_SET) == -1) { perror ("lseek"); return -1; } write (fd, "\0", 1); if (lseek (fd, 0, SEEK_SET) == -1) { perror ("lseek"); return -1; } pMap = (char*) mmap (NULL, BUFSIZ, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if ((size_t) pMap == -1) { perror ("mmap"); return -1; } while (1) { fprintf (stderr, " OR $ "); fgets (buffer, sizeof (buffer) - 1, stdin); #if 0 if (munmap (pMap, BUFSIZ)) { perror ("munmap"); return -1; } pMap = (char*) mmap (NULL, BUFSIZ, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if ((size_t) pMap == -1) { perror ("mmap"); return -1; } #endif struct flock lck = { F_WRLCK, /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK */ SEEK_SET, /* Where `l_start' is relative to (like `lseek') */ 0, /* Offset where the lock begins */ 0, /* Size of the locked area; zero means until EOF */ getpid () /* Process holding the lock */ }; if (fcntl (fd, F_SETLK, &lck)) { perror ("fcntl"); return -1; } if (buffer [0] == '\n') { fprintf (stderr, "Mapped file contents: %s\n", pMap); } else { strncpy (pMap, buffer, strlen (buffer) - 1); fprintf (stderr, "Written to mapped file: %s\n", pMap); } if (msync (pMap, BUFSIZ, MS_SYNC | MS_INVALIDATE)) { perror ("msync"); return -1; } lck.l_type = F_UNLCK; if (fcntl (fd, F_SETLK, &lck)) { perror ("fcntl"); return -1; } } return 0; }