Hi,
I am trying to figure out how to get my program to do one of two things:
Either...
1. Create and remove a semaphore based on me entering a 'r' in the command line at argv[1]
or
2. If argv[1] is a 'n', then I want check to see if the semaphore exists first using the IPC_EXCL parameter and then display perror("semget: file exists")
Hope that makes sense...here is my code:
# include <stdio.h>
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/sem.h>
# include <unistd.h>
# include <stdlib.h>
union semun
{
int val;
struct semid_ds *buf;
ushort *array;
};
int main(int argc, char *argv[])
{
int sem_id, sem_value, i;
int ns = atoi(argv[2]);
char n = atoi(argv[1]);
int j;
key_t ipc_key;
struct semid_ds sem_buf;
ushort sem_array[ns];
union semun arg;
ipc_key = ftok(".", 'S');
if ((argc - 3) != ns) {
printf("Arguments not matched. Number of semaphores is %d\n", ns);
exit(1);
}
for (j = 0; j < ns + 1; j++){
sem_array[j] = atoi(argv[j+3]);
if(atoi(argv[j+3]) == atoi(argv[argc-1]))
break;
}
/* Create semaphore */
if ((sem_id = semget(ipc_key, ns, IPC_CREAT | IPC_EXCL | 0666)) == -1)
{
perror ("semget: File exists");
exit(1);
}
printf ("Semaphore identifier %d\n", sem_id);
/* Set arg (the union) to the address of the storage location for */
/* returned semid_ds value */
arg.buf = &sem_buf;
if (semctl(sem_id, 0, IPC_STAT, arg) == -1) {
perror ("semctl: IPC_STAT");
exit(2);
}
printf ("Create %s", ctime(&sem_buf.sem_ctime));
/* Set arg (the union) to the address of the initializing vector */
arg.array = sem_array;
if (semctl(sem_id, 0, SETALL, arg) == -1)
{
perror("semctl: SETALL");
exit(3);
}
for (i=0; i<ns; ++i)
{
if ((sem_value = semctl(sem_id, i, GETVAL, 0)) == -1)
{
perror("semctl : GETVAL");
exit(4);
}
printf ("Semaphore %d has value of %d\n",i, sem_value);
}
/* remove semaphore */
if (semctl(sem_id, 0, IPC_RMID, 0) == -1)
{
perror ("semctl: IPC_RMID");
exit(5);
}
}