Пример #1
0
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;
}
Пример #2
0
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;
    }


	}









}
Пример #3
0
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;
}
Пример #4
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;
		}
	}
}
Пример #5
0
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;
}