#include #include #include #include #include #include #include #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; }