#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#define db 0
void debug(int desc, char * tekst, char * pid) {
char *MSG = (char *) malloc((2 + strlen(pid) + strlen(tekst)));
strcpy(MSG, pid);
strcat(MSG, "\n");
strcat(MSG, tekst);
write(desc, MSG, (int)strlen(MSG));
}
int main(int argc, char *argv[]) {
int writer_number = atoi(argv[1]);
pid_t parent = getppid();
char parent_str[20];
sprintf(parent_str, "%d", parent);
pid_t pid = getpid();
char pid_str[20];
sprintf(pid_str, "%d", pid);
int inst;
if(db == 1) inst = open("test.txt", O_CREAT | O_WRONLY | O_APPEND , S_IRUSR | S_IWUSR);
int fd;
if ((mkfifo(parent_str, S_IRWXU | S_IRWXG | S_IRWXO)) != 0) {
if (errno == EEXIST) {
if(db == 1) debug(inst, " WRITER. Fifo DUZE juz stworzone. Otwieram do odczytu.\n", pid_str);
if ((fd = open(parent_str, O_WRONLY|O_APPEND)) == -1) exit(1);
} else {
exit(1);
}
} else {
if(db == 1) debug(inst, " WRITER. Fifo DUZE nie stworzone. Tworzę i otwieram do odczytu.\n", pid_str);
if ((fd = open(parent_str, O_WRONLY|O_APPEND)) == -1) exit(1);
}
int wd;
int special = 0;
char writer_parent_str[20];
sprintf(writer_parent_str, "%d", parent);
writer_parent_str[strlen(writer_parent_str) + 1] = writer_parent_str[strlen(writer_parent_str)];
writer_parent_str[strlen(writer_parent_str)] = 'W';
if ((mkfifo(writer_parent_str, S_IRWXU | S_IRWXG | S_IRWXO)) != 0) {
if (errno == EEXIST) {
if(db == 1) debug(inst, " WRITER. Nie zostane specjalnym writerem.\n", pid_str);
if ((wd = open(writer_parent_str, O_WRONLY|O_APPEND)) == -1) exit(1);
special = 0;
} else {
exit(1);
}
} else {
if(db == 1) debug(inst, " WRITER. Zostalem specjalnym writerem.\n", pid_str);
if ((wd = open(writer_parent_str, O_RDONLY)) == -1) exit(1);
special = 1;
}
int val;
char buf[20];
fd_set readfds;
int ok_3 = 1;
int ok_4 = 1;
if(db == 1) debug(inst, " WRITER. Zaczynam produkcje liczb.\n", pid_str);
while(ok_3 == 1 || ok_4 == 1) {
FD_ZERO(&readfds);
if(ok_3) FD_SET(3, &readfds);
if(ok_4) FD_SET(4, &readfds);
int ready_for_reading = select(5, &readfds, NULL, NULL, NULL);
if(ready_for_reading) {
if (FD_ISSET(3, &readfds)) {
if (read(3, &val, 4) > 0) {
int i;
int n = sprintf(buf, "%d", val);
for (i = n; i < 20; i++) buf[i] = ' ';
buf[19] = '\n';
if (n > 0) write(fd, buf, 20);
} else {
ok_3 = 0;
if(db == 1) debug(inst, " WRITER. Trojka skonczyla prace.\n", pid_str);
}
}
if (FD_ISSET(4, &readfds)) {
if (read(4, &val, 4) > 0) {
int i;
int n = sprintf(buf, "%d", val);
for (i = n; i < 20; i++) buf[i] = ' ';
buf[19] = '\n';
if (n > 0) write(fd, buf, 20);
} else {
ok_4 = 0;
if(db == 1) debug(inst, " WRITER. Czworka skonczyla prace.\n", pid_str);
}
}
}
}
if(db == 1) debug(inst, " WRITER. Wgl producenci skonczyli produkcje.\n", pid_str);
if(special == 0) {
write(wd, "1", 1);
if(db == 1) debug(inst, " WRITER. Nie jestem specjalny wiec zapisuje jedynke.\n", pid_str);
} else {
int count = 0;
char buff[2];
buff[1] = '\n';
if(db == 1) debug(inst, " WRITER. Jestem specjalny czekam na reszte.\n", pid_str);
while(count != writer_number - 1){
buff[0] = '0';
if(read(wd, &buff, 1) > 0) {
if (buff[0] == '1') {
if(db == 1) debug(inst, " WRITER. Ktos zakonczyl i sie odrejestrowal.\n", pid_str);
count++;
}
}
}
if(db == 1) debug(inst, " WRITER. Wszyscy skonczyli.\n", pid_str);
char del[100];
del[0] = 'r';
del[1] = 'm';
del[2] = ' ';
int i = 3, k = 0;
for(k = 0; k < strlen(parent_str); k++, i++) {
del[i] = parent_str[k];
}
del[i++] = ' ';
for(k = 0; k < strlen(writer_parent_str); k++, i++) {
del[i] = writer_parent_str[k];
}
system(del);
if(db == 1) debug(inst, " WRITER. Posprzatalem, koncze robote.\n", pid_str);
}
if(db == 1) close(inst);
close(fd);
close(wd);
close(3);
close(4);
return 0;
}