Risistemati ed insiriti nella relativa sezione gli esempi di uso dei
[gapil.git] / listati / message_getter.c
diff --git a/listati/message_getter.c b/listati/message_getter.c
new file mode 100644 (file)
index 0000000..4b19bef
--- /dev/null
@@ -0,0 +1,49 @@
+void HandSigInt(int sig);
+#define MSGMAXSIZE 256
+char *shmname = "messages";
+char *semname = "messages";
+
+int main(int argc, char *argv[]) 
+{
+    sem_t * sem, void * shm_ptr, time_t t;
+    ...
+    Signal(SIGINT, HandSigInt);
+    // get a shared memory segment
+    if ((shm_ptr = CreateShm(shmname, MSGMAXSIZE, 0666, 0)) == NULL) {
+       perror("Cannot find shared memory");
+       exit(1);
+    }
+    // get a locked semaphore
+    if ((sem = sem_open(semname, O_CREAT|O_EXCL, 0666, 0)) == SEM_FAILED) {
+       perror("Cannot open semaphore");
+       exit(1);
+    }
+    // set initial string
+    strncpy((char *) shm_ptr, argv[optind], MSGMAXSIZE);
+    // do initial release
+    if (sem_post(sem) != 0) {
+       perror("cannot do semaphore initial release");
+       exit(1);
+    }
+    // main loop
+    while(1) {
+       if (sem_getvalue(sem, &i) !=0) {             // get sem values
+           perror("cannot get semaphore value");
+           exit(1);
+       }
+       printf("sem=%i, ", i);                       // print sem values
+       t = time(NULL);                              // get time
+       printf("%s", ctime(&t));                     // print time
+       if (sem_wait(sem) != 0) {                    // acquire semaphore
+           perror("cannot use semaphore");
+           exit(1);
+       }
+       printf("message: %s\n", (char *) shm_ptr );  // print message
+       if (sem_post(sem) != 0) {                    // release semaphore
+           perror("cannot release semaphore");
+           exit(1);
+       }
+       sleep(1);
+   }
+exit(0);    
+}