LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   IPC - semphores and static functions (https://www.linuxquestions.org/questions/programming-9/ipc-semphores-and-static-functions-134101/)

Hko 01-12-2004 04:20 PM

IPC - semphores and static functions
 
In the book "Beginning Linux Programming [Wrox Press]" there's an example about IPC semaphores. It implements the simplest form of a semaphore (a binary semaphore) by a set of 4 functions. Alle of these functions are "static". Anybody knows why they are static functions? Do they need to be static? Why (not)?
Code:

/* Taken from the book "Beginning Linux Programming" by Wrox Press
 * released under GPL by Wrox
 */

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

static int set_semvalue(void);
static void del_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);

static int sem_id;


int main(int argc, char *argv[])
{
    int i;
    int pause_time;
    char op_char = 'O';

    srand((unsigned int)getpid());
   
    sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT);

    if (argc > 1) {
        if (!set_semvalue()) {
            fprintf(stderr, "Failed to initialize semaphore\n");
            exit(EXIT_FAILURE);
        }
        op_char = 'X';
        sleep(2);
    }
   
    for(i = 0; i < 10; i++) {       

        if (!semaphore_p()) exit(EXIT_FAILURE);

            /* start of critical section */
        printf("%c", op_char);fflush(stdout);
        pause_time = rand() % 3;
        sleep(pause_time);
        printf("%c", op_char);fflush(stdout);
            /* end of critical section */       

        if (!semaphore_v()) exit(EXIT_FAILURE);
       
        pause_time = rand() % 2;
        sleep(pause_time);
    }   

    printf("\n%d - finished\n", getpid());

    if (argc > 1) {   
        sleep(10);
        del_semvalue();
    }
       
    exit(EXIT_SUCCESS);
}

static int set_semvalue(void)
{
    union semun sem_union;

    sem_union.val = 1;
    if (semctl(sem_id, 0, SETVAL, sem_union) == -1) return(0);
    return(1);
}

static void del_semvalue(void)
{
    union semun sem_union;
   
    if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
        fprintf(stderr, "Failed to delete semaphore\n");
}

static int semaphore_p(void)
{
    struct sembuf sem_b;
   
    sem_b.sem_num = 0;
    sem_b.sem_op = -1; /* P() */
    sem_b.sem_flg = SEM_UNDO;
    if (semop(sem_id, &sem_b, 1) == -1) {
        fprintf(stderr, "semaphore_p failed\n");
        return(0);
    }
    return(1);
}

static int semaphore_v(void)
{
    struct sembuf sem_b;
   
    sem_b.sem_num = 0;
    sem_b.sem_op = 1; /* V() */
    sem_b.sem_flg = SEM_UNDO;
    if (semop(sem_id, &sem_b, 1) == -1) {
        fprintf(stderr, "semaphore_v failed\n");
        return(0);
    }
    return(1);
}


kev82 01-12-2004 04:55 PM

static functions are not exported, i always declare functions static unless i want them to be called from an external object file, the author most likely decided that it would be unwise for other object files to be able to call thses functions hence he made them static. i dont think its necessary though.


All times are GMT -5. The time now is 06:36 PM.