diff --git a/README.md b/README.md new file mode 100644 index 0000000..51b25a2 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# OS diff --git a/error.log b/error.log new file mode 100644 index 0000000..b0e2aa0 --- /dev/null +++ b/error.log @@ -0,0 +1,4 @@ +thread_game.c +- не выдается сообщения об ошибке при открытие несуществующего файла или файла, к которому нет прав доступа +- при заполнении всего экрана символы начинают перезатираться в правом нижнем углу +- если нет make-файла в где-то должно быть написано как это все собирается. Собирал по памяти, а должен был через make файл \ No newline at end of file diff --git a/fork.c b/fork.c new file mode 100644 index 0000000..0b49fde --- /dev/null +++ b/fork.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + int pid = fork (); + char parent_filename[41] = "process_"; + char child_filename[41] = "process_"; + char buffer_parent [30]; + char buffer_child [30]; + if (pid == -1) + printf ("Error \n"); + else if (pid != 0) + { + wait(NULL); + printf("parent %d\n", getpid()); + sprintf (buffer_parent, "%d", getpid()); + sprintf (buffer_child, "%d", pid); + strcat(parent_filename, buffer_parent); + FILE * parent_file = fopen(parent_filename,"wb"); + strcat (buffer_parent, " - parent\n"); + strcat (buffer_child, " - child\n"); + fwrite(buffer_parent, strlen(buffer_parent), 1, parent_file); + fwrite(buffer_child, strlen(buffer_child), 1, parent_file); + fclose(parent_file); + } + else + { + printf ("child %d\n", getpid()); + sprintf (buffer_child, "%d", getpid()); + strcat(child_filename, buffer_child); + sprintf (buffer_child, "%d", getppid()); + FILE * child_file = fopen(child_filename,"wb"); + fwrite(buffer_child, strlen(buffer_child), 1, child_file); + fclose(child_file); + } + return 0; +} diff --git a/pid.c b/pid.c index 4a15a20..0e0ca33 100644 --- a/pid.c +++ b/pid.c @@ -4,32 +4,32 @@ int main() { - char p_data[15]; // , + char p_data[15]; // в эти строки будут записаны данные, которые нужно записать в файлы char c_data[15]; - char p_filename[32] = "parent_process_id"; // + char p_filename[32] = "parent_process_id"; // в эти строки будут записаны названия создаваемых процессами файлов char c_filename[31] = "child_process_id"; - int pid = fork(); // + int pid = fork(); // копируем родительский процесс - if (pid == -1) { printf("Error, child process is not created\n"); } // fork() + if (pid == -1) { printf("Error, child process is not created\n"); } // если fork() возвращает ошибку - if (pid == 0) // + if (pid == 0) // для дочернего процесса { - snprintf(c_data, 15, "%d", getpid()); // pid - strcat(c_filename, c_data); // , , pid - snprintf(c_data, 15, "%d", getppid()); // ppid + snprintf(c_data, 15, "%d", getpid()); //записываем pid дочернего процесса в строку + strcat(c_filename, c_data); // получаем имя файла, создаваемого дочерним процессом, содержащее pid + snprintf(c_data, 15, "%d", getppid()); //записываем ppid процесса FILE * c_file = fopen(c_filename, "wb"); fwrite(c_data, strlen(c_data), 1, c_file); fclose(c_file); } - else // ( fork() pid ) + else // для родительского процесса (если fork() вернул pid дочернего) { wait(); - snprintf(p_data, 15, "%d", getpid()); // pid - snprintf(c_data, 15, "%d", pid); // pid - strcat(p_filename, p_data); // , + snprintf(p_data, 15, "%d", getpid()); // записываем в строку pid родительского процесса + snprintf(c_data, 15, "%d", pid); // записываем в строку pid дочернего процесса + strcat(p_filename, p_data); // получаем имя файла, создаваемого родительским процессом strcat(p_data, "\n"); FILE * p_file = fopen (p_filename, "wb"); diff --git a/thread_game.c b/thread_game.c new file mode 100644 index 0000000..d70dba4 --- /dev/null +++ b/thread_game.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include + +void *print_func (void * arg) +{ + char buffer; + fread(&buffer, 1, 1, arg); + while (!feof(arg)) + { + printw("%c", buffer); + usleep(10000); + fread(&buffer, 1, 1, arg); + refresh(); + } + refresh(); + pthread_exit(NULL); +} + +int main() +{ + initscr(); + printw("Enter the path to the file \n"); /*путь до файла, мои превосходные знания английского*/ + char filename[80]; + getstr(filename); + FILE * file = fopen(filename, "r"); + if (file==NULL) + { + printw("Ошибка при открытии файла"); + return 1; + } + else printw("C - start/continue\nS - pause\nQ - quit \n\n"); + /*C - начать/продолжить работу S - поставить программу на паузу Q - выход из программы*/ + pthread_t print; + int buf = getch(); + printw("\n"); + bool work = false; + while (1) + { + if (work == false && (buf=='c' || buf=='C')) + { + pthread_create(&print, NULL, print_func, file); + work = true; + } + if (buf=='s' || buf=='S') + { + pthread_cancel(print); + work = false; + } + if (buf=='q' || buf=='Q') + { + pthread_cancel(print); + break; + } + buf = getch(); + printw("\n"); + } + pthread_join(print, NULL); + refresh(); + system("pause"); + endwin(); + return 0; +}