Reputation: 12621
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
int main()
{
key_t key, k, shmid;
int ret, semid, i = 0;
struct sembuf op[1];
void *shmptr = (void *) 0;
union semun {
int val;
struct senid_ds *buf;
unsigned short *array;
};
union semun arg;
/* Creating a shared memory */
k = ftok(".", 1);
if (-1 == k) {
perror("\n ftok \n");
return 1;
}
shmid = shmget(k, 1000, IPC_CREAT | 0744);
if (-1 == shmid) {
perror("\n Shared memory creation failed \n");
return 2;
}
shmptr = shmat(shmid, (void *) 0, 0);
if (NULL == shmptr) {
perror("\n Process cant attach to shared memory segment! \n");
return 3;
}
/* Creating semaphore */
key = ftok(".", 4);
if (-1 == key) {
perror("\n ftok \n");
return 4;
}
#if 0
semid = semget(key, 1, IPC_CREAT);
#else
semid = semget(key, 1, 0);
#endif
if (-1 == semid) {
perror("\n Cannot create semaphore \n");
return 5;
}
#if 0
arg.val = 1;
ret = semctl(semid, 0, SETVAL, arg);
printf("\n ret : %d \n", ret);
#endif
op[0].sem_num = 0;
op[0].sem_op = -1;
op[0].sem_flg = SEM_UNDO;
ret = semop(semid, op, 1);
// printf("\n ret : %d semop : %d\n",ret,op[0].sem);
printf("\n Process 1 locked sem1 \n");
/* Do Operation on shared resource */
while (i < 4) {
strcpy((char*) shmptr, "BDC");
printf("\n %s \n", (char *) shmptr);
sleep(2);
printf("\n After sleep \n");
i++;
shmptr++;
}
op[0].sem_op = 1;
ret = semop(semid, op, 1);
printf("\n Process A unlocked sem1 \n");
return 0;
}
I tried an example program to lock the shared memory segment . I tried 2 instances of the same program. to see whether the semaphore is locking properly or not. But the above program always allows the other process to use the shared memory when the process1 has already locked. Couldnt identify where the mistake is.
Upvotes: 0
Views: 1826
Reputation: 7832
You should enable the IPC_CREAT
statement and bitwise-or into the 3rd argument the necessary but missing permissions (S_IRWXU, at least).
You should enable the SETVAL
statement to initialize the semaphore to 1 but only execute that statement based on external input (i.e., the program is invoked with an argument that causes it to create the semaphore and initialize it); otherwise, the program should assume that the semaphore already exists.
You need to check the return values from the semop()
calls.
Upvotes: 1