X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sources%2Fmessage_getter.c;h=8b3ec2d3c0856bffc35f74b61cfe5a0975303647;hp=5ffba091b1a1c1a2b4910b026bc0194e70cb9fda;hb=9fc37da8fe691ce7ca6222773aace47c5edef3d1;hpb=5b56553e2294af812321ffaea6b296d2ad068f41 diff --git a/sources/message_getter.c b/sources/message_getter.c index 5ffba09..8b3ec2d 100644 --- a/sources/message_getter.c +++ b/sources/message_getter.c @@ -93,42 +93,38 @@ int main(int argc, char *argv[]) usage(); } Signal(SIGINT, HandSigInt); - // Get shared memory segment - shm_ptr = CreateShm(shmname, MSGMAXSIZE, 0666, 0); - if ( shm_ptr == NULL) { + // get a shared memory segment + if ((shm_ptr = CreateShm(shmname, MSGMAXSIZE, 0666, 0)) == NULL) { perror("Cannot find shared memory"); exit(1); } - // set initial string - strncpy((char *) shm_ptr, argv[optind], MSGMAXSIZE); - // open the semaphore or create it locked - if ( (sem = sem_open(semname, O_CREAT, 0666, 0)) == SEM_FAILED ) { + // get a locked semaphore + if ((sem = sem_open(semname, O_CREAT|O_EXCL, 0666, 0)) == SEM_FAILED) { perror("Cannot open semaphore"); exit(1); } - // check if first time creation, and unlock - if ( sem_getvalue(sem, &i) != 0) { - perror("cannot get initial semaphore value"); + // 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); - } else - if (i == 0) - if ( sem_post(sem) != 0) { - perror("cannot do semaphore initial release"); - exit(1); - } + } // main loop while(1) { - // acquire semaphore - if ( sem_wait(sem) != 0) { + 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); } - t = time(NULL); - printf("%s", ctime(&t)); - sem_getvalue(sem, &i); - printf("sem=%i, ", i); - printf("message: %s\n", (char *) shm_ptr ); - if ( sem_post(sem) != 0) { + printf("message: %s\n", (char *) shm_ptr ); // print message + if (sem_post(sem) != 0) { // release semaphore perror("cannot release semaphore"); exit(1); } @@ -152,7 +148,7 @@ void usage(void) { void HandSigInt(int sig) { - RemoveShm(shmname); - sem_unlink(semname); + if (RemoveShm(shmname) != 0) perror("Cannot remove shared memory"); + if (sem_unlink(semname)!= 0) perror("Cannot remove semaphore") ; exit(0); }