there is something wrong when i try to add data to my 2. msg queue.

when i disable queue1[output] the code works perfect, but when i enable it the program just gets stuck

to explain whats going on
im creating 3 proccesors where processor 1 read some data from a pipe and putting it in a massage queue, and processor 2 and 3 reads the data from the massage queue, and do some checks and then put the data in a new massage queue

the mistake is when i try to put information in the new queue

Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>




struct my_msg_st {
    long int my_msg_type;
    char some_text[BUFSIZ];
};
struct my_queue {
    long int my_msg_type;
    char some_text[BUFSIZ];
};
union semun

{

    int val;

    struct semid_ds *buf;

    unsigned short int *array;

};
union semun sem_union;
int sem_id;
void down(int sem_nummer);
void up(int sem_nummer);
char output[100];
fflush(stdin);
int msgid1;
pid_t pid, pid1, pid2;

void adm(char *output);
char checkcpr(char *cpr1);
void queue1(char *queue);

struct my_msg_st some_data;
long int msg_to_receive = 0;
int msgid;


int main()
{
	sem_id = semget((key_t)1123,3,0666 | 0666 | IPC_CREAT);
	sem_union.val = 1;

	semctl(sem_id, 0, SETVAL, sem_union);
	sem_union.val = 0;

	semctl(sem_id, 1, SETVAL, sem_union);
	sem_union.val = 1;

	semctl(sem_id, 2, SETVAL, sem_union);
	
	//mutexen til skrivTilFil initialiseres
	pthread_mutex_init(&kontrol_mutex, NULL); 

	int i;
	
	
	
	msgid1 = msgget((key_t)9911, 0666 | IPC_CREAT);
	msgid = msgget((key_t)1255, 0666 | IPC_CREAT);

	if (msgid == -1) {
        fprintf(stderr, "msgget failed with error: %d\n", errno);
        exit(EXIT_FAILURE);
  	  }

	int antal=1;
	char test[80];
	

	pid2=fork();
	if(pid2==0)
	{
	printf("test");
	return;
	}	
	else
	{
	pid =fork();
	if(pid==0)
	{	
		while ( fgets( output, sizeof output, stdin ) != NULL ) 
			{
			some_data.my_msg_type = 1;
				
			strcpy(some_data.some_text, output);
			if (msgsnd(msgid, (void *)&some_data, 1000, 0) == -1) 
					{
            				fprintf(stderr, "msgsnd failed\n");
            				exit(EXIT_FAILURE);
					};
			};
		
	return;
	}
	else
	{
	pid1=fork();
	if(pid1==0)
		{	
		sleep(1);	
		while(1)
			{
				down(0);
				sleep(1);
				if (msgrcv(msgid, (void *)&some_data, BUFSIZ,msg_to_receive, 0) == -1) 
					{
        	    			fprintf(stderr, "msgrcv failed with error: %d\n", errno);
        	    			exit(EXIT_FAILURE);
        				};
				
				
				printf("u wrote barn nummer 1: %s\n", some_data.some_text);
				adm(some_data.some_text);
				up(1);
				
		
			};
		
	return;
	
	}
	else
	{
		
		while(1)
		{
			down(1);
			sleep(1);
			if (msgrcv(msgid, (void *)&some_data, BUFSIZ,
                   	msg_to_receive, 0) == -1) {
        	    	fprintf(stderr, "msgrcv failed with error: %d\n", errno);
        	    	exit(EXIT_FAILURE);
        				};
			
			printf("u wrote barn nummer 2: %s\n", some_data.some_text);
			adm(some_data.some_text);
			up(0);
			
		};
	return;
	};
	
	};


	
		
	};


};
void down(int sem_nummer)

{

    struct sembuf sem_b;



    sem_b.sem_num = sem_nummer;

    sem_b.sem_op = -1;		//down el. P()

    sem_b.sem_flg = SEM_UNDO;

    semop(sem_id, &sem_b,1);

};



void up(int sem_nummer)

{

    struct sembuf sem_b;



    sem_b.sem_num = sem_nummer;

    sem_b.sem_op = 1;		//up el. V()

    sem_b.sem_flg = SEM_UNDO;

    semop(sem_id, &sem_b,1);

};

void adm(char *output)
{

	char *tempCpr, *tempAnkomst, *tempSkade;
	tempCpr = malloc(10*sizeof(char));
	tempAnkomst = malloc(1*sizeof(char));
	tempSkade = malloc(1*sizeof(char));
	int i;
	for(i=0; i<10; i++) 
	{
       	tempCpr[i] = output[i];
	}; 
	
	tempAnkomst[0] = output[11];
	tempSkade[0] = output[13];
	tempCpr[10]=0; 
	printf("\ncpr er %s, og ankomst er %c, og skade er %c\n", tempCpr, tempAnkomst[0], tempSkade[0]);

	int resultat = checkcpr(tempCpr);

	if(resultat ==1)
	{
		skrivTilFil("\ncpr passer ikke.. tråden dræbes\n");	
	}
	else if(resultat ==0)
	{	
		skrivTilFil("\n cpr passer\n");
		queue1(output); // the mistake is here 
	};
};

void skrivTilFil(char *tekst)
{	
	pthread_mutex_lock(&kontrol_mutex); 
	printf("%s",tekst);
	
	FILE *DataFile = fopen(LOGFILE, "a");
	fprintf(DataFile, tekst);
	fclose(DataFile);
	pthread_mutex_unlock(&kontrol_mutex);  
};

char checkcpr(char *cpr1)
{
	
	int i;

	
	int array[10];


	for(i = 0; i<10; i++)
	{

	char tmp = cpr1[i];

	array[i] = atoi(&tmp);

	}


int nytArray[10];
nytArray[0] = array[0] * 4;
nytArray[1] = array[1] * 3;
nytArray[2] = array[2] * 2;
nytArray[3] = array[3] * 7;
nytArray[4] = array[4] * 6;
nytArray[5] = array[5] * 5;
nytArray[6] = array[6] * 4;
nytArray[7] = array[7] * 3;
nytArray[8] = array[8] * 2;

int sum = nytArray[0]+nytArray[1]+nytArray[2]+nytArray[3]+nytArray[4] + nytArray[5] + nytArray[6] + nytArray[7] + nytArray[8];

int summod = sum%11;

int resultat = 11-summod;
int tilbagemeldning = 1;
if(array[9]==resultat)
	{ 
	tilbagemeldning = 0;
	};

return tilbagemeldning;

};

void queue1(char *queue)
{
	
	down(2);
	sleep(1);
	struct my_queue data;
	
	char buffer[BUFSIZ];
	data.my_msg_type = 1;
	strcpy(data.some_text, queue);
	if (msgsnd(msgid1, (void *)&data, 1000, 0) == -1) 
					{
            				fprintf(stderr, "msgsnd failed\n");
            				exit(EXIT_FAILURE);
					};

	printf("dette bliver skrevet ind i queue %s", queue);
	
	up(2);
	
	
	


};