-
cyclic buffer
i'm trying to produce a program that stays in a endless loop inserting integers into a cyclic array, and i'm stuck on getting integers into the array can anyone point me in the correct direction? my code so far is:
Code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <errno.h>
#include <string.h>
#define KEY (key_t) 12345
#define MUTEX (key_t) 100
#define PERM 0600
extern int errno;
extern int showsem(key_t);
int initsem(key_t, int);
int p(int);
int v(int);
int mutex;
int OFLO;
int UFLO;
i
struct shseg
{
int ptr;
char buffer[100];
} *ashseg;
int main()
{
int shmid;
shmid=shmget(KEY, sizeof(struct shseg), IPC_CREAT|0666);
ashseg=(struct shseg *) shmat(shmid, 0, 0); //note type cast
mutex=initsem(MUTEX,1);
OFLO=initsem(OFLO,3);
UFLO=initsem(UFLO,0);
for (ashseg->ptr=0;ashseg->ptr<strlen(ashseg->buffer); ashseg->ptr++) {
p(OFLO);
p(mutex);
strncpy(ashseg->buffer, "test string\n", 20);
putchar(ashseg->buffer[getchar()]);
v(mutex);
v(UFLO);
sleep(1);}
killsem(mutex);
killsem(OFLO);
killsem(UFLO);
}
int initsem(key_t semkey,int semval)
{
int status=0, semid;
if ((semid=semget(semkey,1,PERM|IPC_CREAT|IPC_EXCL))==-1)
if (errno==EEXIST)
semid=semget(semkey,1,0);}
else
status=semctl(semid,0,SETVAL,semval);
if (semid==-1||status==-1) {
perror("initsem failed");
return(-1);}
return(semid);
}
int p(int semid)
{
struct sembuf p_buf;
p_buf.sem_num = 0;
p_buf.sem_op = -1;
p_buf.sem_flg = SEM_UNDO;
if (semop(semid, &p_buf, 1) == -1) {
perror("p(semid) failed");
exit(1);
}
else
return(0);
}
int v(int semid)
{
struct sembuf v_buf;
v_buf.sem_num = 0;
v_buf.sem_op = 1;
v_buf.sem_flg = SEM_UNDO;
if (semop(semid, &v_buf,1) == -1) {
perror("v(semid) failed");
exit(1);
}
else
return(0);
}
int killsem(semid)
{
if (semctl(semid,0,IPC_RMID,0)==-1)
return(-1);
return(0);}
-
First, fix your indentation. Then someone may look at your code.
-
your way to place braces is just purely horrble
Code:
int initsem(key_t semkey,int semval)
{
int status=0, semid;
if ((semid=semget(semkey,1,PERM|IPC_CREAT|IPC_EXCL))==-1)
if (errno==EEXIST)
semid=semget(semkey,1,0);
}
else
status=semctl(semid,0,SETVAL,semval);
if (semid==-1||status==-1)
{
perror("initsem failed");
return(-1);
}
return(semid);
}