Sanke
Sanke

Reputation: 746

Why do I get an error "undefined reference to 'sem_init' " when I compile C code with shared memory

I am a starter to work with shared memory and I have implemented a parallel adder in which each of the k processors is implemented as a child process. Specifically, given a set of n integers and value of k, the main program creates k child processes, assigns each child process to compute the total of its assigned ceiling of n/k numbers, waits for the sub-total from each of the k child processes, sum up the sub-totals, and print the result of each sub-total as well as the overall total. I have not use threads.

This program is created for assignment in the college and they it is expected to run in any department computer.

This code correctly compile on Kali Linux but I can not compile and run on other Linux versions. When I tried to compile on Ubuntu it gives the error saying

undefined reference to 'sem_init'

I used -lrt in the line of compiling. Please help me with this problem.

This is the code that I created.

#include<stdio.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<semaphore.h>
#include<unistd.h>
#include<math.h>
#include<stdlib.h>

#define BUFFER_SIZE 100
#define BUFFER_SUB 2

typedef struct
{
    int bufMax;
    int datalimit;
    int buff[BUFFER_SIZE];
    sem_t mutex, empty, full;

} shared_inputs;
typedef struct
{
        int sub[BUFFER_SUB];
        sem_t mutex,empty,full;
}sub_tot;

int main(int argc, char *argv[])
{
    int x = 0;
    int data,count,i,j,tot;
    int n;
    int k =atoi(argv[2]);
    int assign_size;
    count = tot =0;




    int segment_id;
        size_t segment_size = sizeof(shared_inputs);
        segment_id = shmget(IPC_PRIVATE,segment_size,IPC_CREAT|0666);
        shared_inputs *shared_memory = shmat(segment_id,NULL,0);

    sem_init(&shared_memory->mutex,1,1);
        sem_init(&shared_memory->empty,1,BUFFER_SIZE);
        sem_init(&shared_memory->full,1,0);



    int segment_idSubs;
        size_t segment_size1 = sizeof(sub_tot);
        segment_idSubs = shmget(IPC_PRIVATE,segment_size1,IPC_CREAT|0666);
        sub_tot *subtotal = shmat(segment_idSubs,NULL,0);

    sem_init(&subtotal->mutex,1,1);
        sem_init(&subtotal->empty,1,BUFFER_SUB);
        sem_init(&subtotal->full,1,0);

    FILE *numFile;
    numFile = fopen(argv[1], "r");



    while(!feof(numFile))
        {
        fscanf(numFile,"%d",&data);
                sem_wait(&shared_memory->empty);
                sem_wait(&shared_memory->mutex);
                shared_memory->buff[x] = data;
                sem_post(&shared_memory->mutex);
                sem_post(&shared_memory->full);
        printf("%d ", shared_memory->buff[x]);
                x++;
        n = x;

        }
    assign_size = ceil((double)n/(double)k);
    printf("\n");
    shared_memory->datalimit = 0;
    shared_memory->bufMax = n-1;
    printf("assigned size : %d \n", assign_size);
    printf("n : %d , k : %d \n",n,k);


    for(i =0; i < k; i++)
    {
        int id;
        int subt = 0;

        id = fork();
        if(id < 0) // error in fork
        {
            perror("Error in fork ");
            exit(300);
        }
        else if(id == 0)//the new child process
        {


            for(j=0;j< assign_size; j++)//getting items from the shared memory
            {

                sem_wait(&shared_memory->full);
                                sem_wait(&shared_memory->mutex);
                                int num = shared_memory->buff[shared_memory->datalimit];
                //printf("%d \n",shared_memory->buff[shared_memory->datalimit]);
                shared_memory->datalimit++;
                                sem_post(&shared_memory->mutex);
                                sem_post(&shared_memory->empty);
                                subt = subt + num;
                if(shared_memory->datalimit == shared_memory->bufMax)
                {
                    break;
                }

            }

            int pid = getpid();
                        sem_wait(&subtotal->empty);
                        sem_wait(&subtotal->mutex);
                        subtotal->sub[0] = pid;
                        subtotal->sub[1] = subt;
                        sem_post(&subtotal->mutex);
                        sem_post(&subtotal->full);
            printf("Sub-total produced by Processor with ID %d: %d \n",pid,subt);

            exit(0);
        }
        else//parent process
        {
            int status;
                        wait(&status);
                        sem_wait(&subtotal->full);
                        sem_wait(&subtotal->mutex);
                        int sub = subtotal->sub[1];
                        sem_post(&subtotal->mutex);
                        sem_post(&subtotal->empty);
                        tot = tot+sub;
        }
    }
    printf("Total: %d \n",tot);


    return 0;

}

Upvotes: 2

Views: 13442

Answers (2)

perepm
perepm

Reputation: 990

You need to add #include <pthread.h> in order to make it work

Upvotes: -2

Sanke
Sanke

Reputation: 746

Need to add -lpthread when compiling and use -lm and -lrt also.

Upvotes: 6

Related Questions