Java Ninja Chronicles By Norris Shelton

Things I learned in the pursuit of code

It’s been almost 2 decades since I did any C programming. Rust doesn’t even begin to describe the difficulties. We had a small programmed that wrapped the Comscire provided C API that needed to be protected from multiple processes accessing the hardware at the same time. Enter the C Named Semaphore. I found several examples, but none of them was a complete example. That’s a shame. The incomplete examples made it that much harder to get working.

Semaphores in Linux was an invaluable resource.

  • Line 4 and 5 are the headers necessary. Semaphore and file control.
  • Line 8 – the name of the named semaphore
  • Line 9– declared the semaphore
  • Line 33 – The semaphore is opened. O_CREATE specifies that the semaphore is created if it doesn’t already exist. The name of the semaphore is specified here.
  • Line 39 – locks the semaphore. This prevents other processes from accessing the code while another process is accessing the protected section.
  • Line 45 – unlocks the semaphore
  • Line 47 – closes the named semaphore
  • Line 49 – deletes the named semaphore. Without this, only you will be able to run the program. The name of the semaphore is specified here.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <semaphore.h>
#include <fcntl.h>
#include <qwqng.hpp>

char semaphoreName[] = "rng_semaphore";
sem_t *namedSemaphore;

/**
 Performs the call to retrieve a random integer.
 returnCount - the number of random integers to return
 */
void doRandCall(int returnCount)
{
  // omitted for brevity
}


/**
 Returns a specified number of random integers from the Comscire hardware RNG.
 argc - count of arguments
 argv - process parameters
 [0] - number of random integers to generate
 */
int main(int argc, char *argv[])
{
    if (argc == 2)
    {
        int returnCount = atoi(argv[1]);
        
        if ((namedSemaphore = sem_open(semaphoreName, O_CREAT, 0644, 1)) == SEM_FAILED)
        {
            perror("named semaphore initialization error");
            exit(1);
        }
        
        sem_wait(namedSemaphore);
        
        /*******************************************************************************/
        doRandCall(returnCount);
        /*******************************************************************************/
        
        sem_post(namedSemaphore);
        
        sem_close(namedSemaphore);
        
        sem_unlink(semaphoreName);
        
        return EXIT_SUCCESS;
    }
}

January 7th, 2015

Posted In: Javaninja

Tags: , , ,

Leave a Comment

WP to LinkedIn Auto Publish Powered By : XYZScripts.com