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);
};