int main() { int state; int child; int fd,i,j; unsigned long buffer[128]; struct fifo *afifo; struct sigaction act; //Miraj helped me with the signal code below sigemptyset(&act.sa_mask); act.sa_flags = 0; act.sa_handler = signal_handler; if(sigaction(SIGUSR1, &act, NULL)) { fprintf(stderr, "Error with sigaction: %s\n",strerror(errno)); exit(-1); } if((afifo = mmap(0,sizeof(struct fifo), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON,-1,0)) == MAP_FAILED) { fprintf(stderr,"Error mappiing region: %s\n", strerror(errno)); exit(-1); } fifo_init(afifo); child = fork(); switch (child) { case -1: fprintf(stderr,"error with fork: %s\n",strerror(errno)); break; case 0: printf("in the child\n"); for(j = 0; j < 128; j++) { buffer[j] = fifo_rd(afifo); printf("%lu\n",buffer[j]); } break; default: for(i = 0; i < 1000;i++) { fifo_wr(afifo,i); } break; } if(munmap(afifo,sizeof(struct fifo)) < 0) { fprintf(stderr,"munmap error: %s\n",strerror(errno)); } return 0; }
int sergetc(fifo_t * fp) { int c; if (fp == NULL) return -1; if (fp->count) { c = fifo_rd(fp); } else { fp->empty = TRUE; c = -1; } return c; }
int main(int argc, char **argv) { if(argc!=3){ printf("Enter correct number of arguments\n"); exit(0); } int numProc=atoi(argv[1]); int numLong=atoi(argv[2]); if(numProc>N_PROC){ fprintf(stderr,"Enter correct number of arguments\n"); } pid_t pid; int i,j; struct fifo f; struct fifo *fif=&f; fif = mmap (NULL, sizeof(struct fifo), PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0); fifo_init(&f); // j=0; for(i=0; i<numProc; i++){ switch(pid=fork()){ case -1: perror("Fork failed"); exit(1); break; case 0: // printf("i:%i\tj:%i\n",i,j); my_procnum=i; for(j=0; j<numLong; j++){ unsigned long d = (j << 6) + i; // printf("%x\n",d); fifo_wr(&f,d); } printf("%x\n",fifo_rd(&f)); exit(0); default: break; } } }
int main(int argc, char const *argv[]){ struct fifo f, *fp; fifo_init(&f); if((fp=(struct fifo *)mmap(NULL,sizeof f,PROT_READ|PROT_WRITE,MAP_ANONYMOUS|MAP_SHARED,-1,0))==MAP_FAILED){ perror("Error using mmap to establish a struct fifo in shared memory"); return -1; } memcpy(fp,&f,sizeof f); unsigned long d; int i,procnum,seqlength=300; for(procnum=1;procnum<N_PROC;procnum++){ switch(fork()){ case -1: perror("fork failed"); return -1; break; case 0: // child (writer) my_procnum=procnum; for(i=0;i<seqlength;i++){ d=my_procnum|(i<<6); //bitwise word with proc id in 1st six bits and seq# in the remaining bits fifo_wr(fp,d); } return 0; break; default: // parent (reader) break; } } my_procnum=0; for(i=0;i<seqlength*(N_PROC-1);i++){ d=fifo_rd(fp); procnum=d&0x3f; d=d>>6; //sequence# fprintf(stdout,"Proccess#:%d, Sequence#:%lu, absolute#: %d\n",procnum,d,i); } for(procnum=1;procnum<N_PROC;procnum++){ int status; if(wait(&status)==-1){ perror("Wait failed"); return -1; } } if(munmap(fp,sizeof f)==-1){ perror("Error calling munmap"); return -1; } return 0; }
void serputc(char c, fifo_t * fp) { if (fp == NULL) return; while (seravailable(fp) == FIFO_SZ) { } fifo_wr(fp, c); // magic is in count-- indivisible, do not optimize if (fp->empty && fp->count) { // buffer had been empty fp->empty = FALSE; c = fifo_rd(fp); if (fp == txfp0) { TXBUF0 = c; } else { TXBUF1 = c; } } }
int main(int argc, char *argv[]){ struct fifo f,*fp; int i,n; unsigned long d; //Establish shared memory region containing the shared fifo if((fp=mmap(NULL,sizeof f,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0))==MAP_FAILED){ fprintf(stderr,"%s: Error using mmap(): %s\n",argv[0],strerror(errno));return -1; } memcpy(fp,&f,sizeof f); fifo_init(fp); //Create virtual processors: a single reader and N_WRITERS writers for(n=1;n<=N_WRITERS;n++){ switch(fork()){ //fork writer process case -1: fprintf(stderr,"%s: Error using fork(): %s\n",argv[0],strerror(errno)); return -1; break; /*not reached*/ case 0: //CHILD PROCESS (writer n) my_procnum=n; for(i=1;i<=N_WORDS;i++) { fifo_wr(fp,((long)i<<P_MSK_SZ)|my_procnum); } return; break; /*not reached*/ default: //PARENT PROCESS (reader) break; } } my_procnum=0; for(i=0;i<N_WRITERS*N_WORDS;i++){ d=fifo_rd(fp);printf("Writer ID: %d, Sequence Number: %d\n",d&(N_PROC-1),d>>P_MSK_SZ); } //Post program cleanup for(n=1;n<=N_WRITERS;n++){ if(wait(NULL)==-1){ fprintf(stderr,"%s:Error using wait(): %s\n",argv[0],strerror(errno));return -1; } } if(munmap(fp,sizeof f)<0){ fprintf(stderr,"%s: Error using munmap(): %s\n",argv[0],strerror(errno));return -1; } return 0; }