From b61ad4616d1b52652b78394451683395153e556e Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Wed, 14 Sep 2022 15:42:05 -0700 Subject: [PATCH 01/40] base ver. of tokenizator --- task1/examples/a.out | Bin 0 -> 16840 bytes task1/homework/.vscode/settings.json | 5 ++ task1/homework/a.out | Bin 0 -> 113680 bytes task1/homework/main.c | 19 +++++ task1/homework/pcmd.c | 2 + task1/homework/pcmd.h | 15 ++++ task1/homework/tokenizator.c | 101 +++++++++++++++++++++++++++ task1/homework/tokenizator.h | 34 +++++++++ 8 files changed, 176 insertions(+) create mode 100755 task1/examples/a.out create mode 100644 task1/homework/.vscode/settings.json create mode 100755 task1/homework/a.out create mode 100644 task1/homework/main.c create mode 100644 task1/homework/pcmd.c create mode 100644 task1/homework/pcmd.h create mode 100644 task1/homework/tokenizator.c create mode 100644 task1/homework/tokenizator.h diff --git a/task1/examples/a.out b/task1/examples/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0228d8bd4d74f0ce67a36135c44815a81bccee83 GIT binary patch literal 16840 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 literal 0 HcmV?d00001 diff --git a/task1/homework/.vscode/settings.json b/task1/homework/.vscode/settings.json new file mode 100644 index 0000000..5f94f34 --- /dev/null +++ b/task1/homework/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "types.h": "c" + } +} \ No newline at end of file diff --git a/task1/homework/a.out b/task1/homework/a.out new file mode 100755 index 0000000000000000000000000000000000000000..9c26cef01eace91e3941877676c271768a6d0bba GIT binary patch literal 113680 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 literal 0 HcmV?d00001 diff --git a/task1/homework/main.c b/task1/homework/main.c new file mode 100644 index 0000000..25aa853 --- /dev/null +++ b/task1/homework/main.c @@ -0,0 +1,19 @@ +#include "pcmd.h" +#include "tokenizator.h" + +int main() +{ + printf("BASH:): "); + + struct CmdTokens s_cmd = {}; + + constructTokens(&s_cmd); + + tokenizator(&s_cmd); + + destructTokens(&s_cmd); + + return 0; +} + +//gcc main.c pcmd.c -D _DEBUG -ggdb3 -O0 -Wall -Wextra -Waggressive-loop-optimizations -Wmissing-declarations -Wcast-align -Wcast-qual -Wchar-subscripts -Wconversion -Wempty-body -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr diff --git a/task1/homework/pcmd.c b/task1/homework/pcmd.c new file mode 100644 index 0000000..64ea207 --- /dev/null +++ b/task1/homework/pcmd.c @@ -0,0 +1,2 @@ +#include "pcmd.h" + diff --git a/task1/homework/pcmd.h b/task1/homework/pcmd.h new file mode 100644 index 0000000..72440e9 --- /dev/null +++ b/task1/homework/pcmd.h @@ -0,0 +1,15 @@ +#ifndef PCMD_H +#define PCMD_H + +#include +#include +#include +#include +#include + +#include "tokenizator.h" + + + + +#endif \ No newline at end of file diff --git a/task1/homework/tokenizator.c b/task1/homework/tokenizator.c new file mode 100644 index 0000000..3ab1578 --- /dev/null +++ b/task1/homework/tokenizator.c @@ -0,0 +1,101 @@ +#include "tokenizator.h" + +void constructTokens(struct CmdTokens* s_commands) +{ + size_t tokensCapacity = 0; + + for (int i = 0; i < MAX_NUM_CMD; i++) + { + s_commands->tokens[i] = NULL; + s_commands->flags[i] = NULL; + + s_commands->commandLen[i] = 0; + s_commands->flagsLen[i] = 0; + } + + return; +} + +void tokenizator(struct CmdTokens* s_commands) +{ + char delim[] = " ,-\n"; + + static char cmd[CMD_MAX_SIZE] = {}; + + fgets(cmd, CMD_MAX_SIZE, stdin); + + int cmdCounter = 0; + char* p = NULL; + char* pos = NULL; + + for (p = godStrtok(cmd, delim, &pos); p != NULL; p = godStrtok(NULL, delim, &pos)) + { + s_commands->tokens[cmdCounter] = p; + s_commands->commandLen[cmdCounter] = strlen(p); + cmdCounter++; + } + + + +} + +void destructTokens(struct CmdTokens* s_commands) +{ + size_t counter = 0; + + while (s_commands->tokens[counter] != NULL) + { + free(s_commands->tokens[counter]); + s_commands->tokens[counter] = NULL; + counter++; + } + counter = 0; + + while (s_commands->flags[counter] != NULL) + { + free(s_commands->flags[counter]); + s_commands->flags[counter] = NULL; + counter++; + } +} + +char* strDuplicator(const char* start, const char* end) +{ + size_t lenStr = end - start; + + char* dup = calloc(lenStr + 1, sizeof(char)); + + if (dup != NULL) + { + strncpy(dup, start, lenStr); + } + + return dup; +} + +char* godStrtok(char* string, char* delimeters, char** pos) +{ + if (string == NULL) + { + string = *pos; + } + + char* walker = string; + char* token = NULL; + + while (*walker != '\0') + { + if (strchr(delimeters, *walker) == 0) + { + walker++; + } + else + { + token = strDuplicator(string, walker); + *pos = walker + strspn(walker, delimeters); + break; + } + } + return token; +} + diff --git a/task1/homework/tokenizator.h b/task1/homework/tokenizator.h new file mode 100644 index 0000000..7527345 --- /dev/null +++ b/task1/homework/tokenizator.h @@ -0,0 +1,34 @@ +#ifndef TOKENIZATOR_H +#define TOKENIZATOR_H + +#include +#include +#include + + +#define CMD_MAX_SIZE 256 +#define MAX_NUM_CMD 16 + +struct CmdTokens +{ + char* tokens[MAX_NUM_CMD]; + char** flags[MAX_NUM_CMD]; + + size_t tokensCapacity; + + size_t commandLen[MAX_NUM_CMD]; + size_t flagsLen[MAX_NUM_CMD]; +}; + +void tokenizator(struct CmdTokens* s_commands); + +void constructTokens(struct CmdTokens* s_commands); + +void destructTokens(struct CmdTokens* s_commands); + +char* strDuplicator(const char *start, const char *end); + +char* godStrtok(char* string, char* delimeters, char** pos); + + +#endif \ No newline at end of file From 1642f19a13a06f45fb1e40633ceb270b8b4f52c3 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Wed, 14 Sep 2022 15:42:35 -0700 Subject: [PATCH 02/40] Delete a.out --- task1/homework/a.out | Bin 113680 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 task1/homework/a.out diff --git a/task1/homework/a.out b/task1/homework/a.out deleted file mode 100755 index 9c26cef01eace91e3941877676c271768a6d0bba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113680 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 From a8305ec1de2ccce81ba1e876b3af74915286edc8 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Wed, 14 Sep 2022 15:46:09 -0700 Subject: [PATCH 03/40] Delete task1/homework directory --- task1/homework/.vscode/settings.json | 5 -- task1/homework/main.c | 19 ----- task1/homework/pcmd.c | 2 - task1/homework/pcmd.h | 15 ---- task1/homework/tokenizator.c | 101 --------------------------- task1/homework/tokenizator.h | 34 --------- 6 files changed, 176 deletions(-) delete mode 100644 task1/homework/.vscode/settings.json delete mode 100644 task1/homework/main.c delete mode 100644 task1/homework/pcmd.c delete mode 100644 task1/homework/pcmd.h delete mode 100644 task1/homework/tokenizator.c delete mode 100644 task1/homework/tokenizator.h diff --git a/task1/homework/.vscode/settings.json b/task1/homework/.vscode/settings.json deleted file mode 100644 index 5f94f34..0000000 --- a/task1/homework/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "types.h": "c" - } -} \ No newline at end of file diff --git a/task1/homework/main.c b/task1/homework/main.c deleted file mode 100644 index 25aa853..0000000 --- a/task1/homework/main.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "pcmd.h" -#include "tokenizator.h" - -int main() -{ - printf("BASH:): "); - - struct CmdTokens s_cmd = {}; - - constructTokens(&s_cmd); - - tokenizator(&s_cmd); - - destructTokens(&s_cmd); - - return 0; -} - -//gcc main.c pcmd.c -D _DEBUG -ggdb3 -O0 -Wall -Wextra -Waggressive-loop-optimizations -Wmissing-declarations -Wcast-align -Wcast-qual -Wchar-subscripts -Wconversion -Wempty-body -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr diff --git a/task1/homework/pcmd.c b/task1/homework/pcmd.c deleted file mode 100644 index 64ea207..0000000 --- a/task1/homework/pcmd.c +++ /dev/null @@ -1,2 +0,0 @@ -#include "pcmd.h" - diff --git a/task1/homework/pcmd.h b/task1/homework/pcmd.h deleted file mode 100644 index 72440e9..0000000 --- a/task1/homework/pcmd.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef PCMD_H -#define PCMD_H - -#include -#include -#include -#include -#include - -#include "tokenizator.h" - - - - -#endif \ No newline at end of file diff --git a/task1/homework/tokenizator.c b/task1/homework/tokenizator.c deleted file mode 100644 index 3ab1578..0000000 --- a/task1/homework/tokenizator.c +++ /dev/null @@ -1,101 +0,0 @@ -#include "tokenizator.h" - -void constructTokens(struct CmdTokens* s_commands) -{ - size_t tokensCapacity = 0; - - for (int i = 0; i < MAX_NUM_CMD; i++) - { - s_commands->tokens[i] = NULL; - s_commands->flags[i] = NULL; - - s_commands->commandLen[i] = 0; - s_commands->flagsLen[i] = 0; - } - - return; -} - -void tokenizator(struct CmdTokens* s_commands) -{ - char delim[] = " ,-\n"; - - static char cmd[CMD_MAX_SIZE] = {}; - - fgets(cmd, CMD_MAX_SIZE, stdin); - - int cmdCounter = 0; - char* p = NULL; - char* pos = NULL; - - for (p = godStrtok(cmd, delim, &pos); p != NULL; p = godStrtok(NULL, delim, &pos)) - { - s_commands->tokens[cmdCounter] = p; - s_commands->commandLen[cmdCounter] = strlen(p); - cmdCounter++; - } - - - -} - -void destructTokens(struct CmdTokens* s_commands) -{ - size_t counter = 0; - - while (s_commands->tokens[counter] != NULL) - { - free(s_commands->tokens[counter]); - s_commands->tokens[counter] = NULL; - counter++; - } - counter = 0; - - while (s_commands->flags[counter] != NULL) - { - free(s_commands->flags[counter]); - s_commands->flags[counter] = NULL; - counter++; - } -} - -char* strDuplicator(const char* start, const char* end) -{ - size_t lenStr = end - start; - - char* dup = calloc(lenStr + 1, sizeof(char)); - - if (dup != NULL) - { - strncpy(dup, start, lenStr); - } - - return dup; -} - -char* godStrtok(char* string, char* delimeters, char** pos) -{ - if (string == NULL) - { - string = *pos; - } - - char* walker = string; - char* token = NULL; - - while (*walker != '\0') - { - if (strchr(delimeters, *walker) == 0) - { - walker++; - } - else - { - token = strDuplicator(string, walker); - *pos = walker + strspn(walker, delimeters); - break; - } - } - return token; -} - diff --git a/task1/homework/tokenizator.h b/task1/homework/tokenizator.h deleted file mode 100644 index 7527345..0000000 --- a/task1/homework/tokenizator.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TOKENIZATOR_H -#define TOKENIZATOR_H - -#include -#include -#include - - -#define CMD_MAX_SIZE 256 -#define MAX_NUM_CMD 16 - -struct CmdTokens -{ - char* tokens[MAX_NUM_CMD]; - char** flags[MAX_NUM_CMD]; - - size_t tokensCapacity; - - size_t commandLen[MAX_NUM_CMD]; - size_t flagsLen[MAX_NUM_CMD]; -}; - -void tokenizator(struct CmdTokens* s_commands); - -void constructTokens(struct CmdTokens* s_commands); - -void destructTokens(struct CmdTokens* s_commands); - -char* strDuplicator(const char *start, const char *end); - -char* godStrtok(char* string, char* delimeters, char** pos); - - -#endif \ No newline at end of file From d75c0c2523771790f3cf85858e461dcf8a22ebd8 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Wed, 14 Sep 2022 15:58:41 -0700 Subject: [PATCH 04/40] Delete a.out --- task1/examples/a.out | Bin 16840 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 task1/examples/a.out diff --git a/task1/examples/a.out b/task1/examples/a.out deleted file mode 100755 index 0228d8bd4d74f0ce67a36135c44815a81bccee83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16840 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 From 89f8115f44a9e83018799a3e763f8e300d423bf9 Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Tue, 20 Sep 2022 00:47:02 -0700 Subject: [PATCH 05/40] homework completed --- task1/homework/main.c | 31 ++++++ task1/homework/makefile | 4 + task1/homework/pcmd.c | 52 ++++++++++ task1/homework/pcmd.h | 16 +++ task1/homework/tokenizator.c | 195 +++++++++++++++++++++++++++++++++++ task1/homework/tokenizator.h | 52 ++++++++++ 6 files changed, 350 insertions(+) create mode 100644 task1/homework/main.c create mode 100644 task1/homework/makefile create mode 100644 task1/homework/pcmd.c create mode 100644 task1/homework/pcmd.h create mode 100644 task1/homework/tokenizator.c create mode 100644 task1/homework/tokenizator.h diff --git a/task1/homework/main.c b/task1/homework/main.c new file mode 100644 index 0000000..a3023ac --- /dev/null +++ b/task1/homework/main.c @@ -0,0 +1,31 @@ +#include "pcmd.h" +#include "tokenizator.h" + +int main() +{ + fprintf(stdout, "BASH:(0)_(0): "); + + struct CmdTokens s_cmd = {}; + + if (constructTokens(&s_cmd) == CONSTRUCT_ERR) + { + fprintf(stderr, "ERROR: Unable to construct token structure\n"); + destructEmptyTokens(&s_cmd); + return CONSTRUCT_ERR; + } + + if (tokenizator(&s_cmd) == MAX_NUM_TOKENS_ERR) + { + fprintf(stderr, "ERROR: Maximum number of commands exceeded\n"); + destructEmptyTokens(&s_cmd); + return MAX_NUM_TOKENS_ERR; + } + + run(&s_cmd); + + destructTokens(&s_cmd); + + return 0; +} + + diff --git a/task1/homework/makefile b/task1/homework/makefile new file mode 100644 index 0000000..0b2fe4f --- /dev/null +++ b/task1/homework/makefile @@ -0,0 +1,4 @@ +CC=gcc + +all: + gcc main.c pcmd.c tokenizator.c -D _DEBUG -ggdb3 -O0 -Wall -Wextra -Waggressive-loop-optimizations -Wmissing-declarations -Wcast-align -Wcast-qual -Wchar-subscripts -Wconversion -Wempty-body -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr \ No newline at end of file diff --git a/task1/homework/pcmd.c b/task1/homework/pcmd.c new file mode 100644 index 0000000..67a2fcf --- /dev/null +++ b/task1/homework/pcmd.c @@ -0,0 +1,52 @@ +#include "pcmd.h" + + +void run(struct CmdTokens* s_commands) +{ + // example /bin/ls -ltr . | grep rw + + int pipeFd[2] = {-1, -1}; + pid_t pid = -1; + int fd_in = -1; + + for (size_t counter = 0; counter < s_commands->pipelineCapacity + 1; counter++) + { + pipe(pipeFd); + + if ((pid = fork()) == -1) + { + fprintf(stderr, "ERROR:Unable to create process. A system-imposed limit on the number of threads was encountered\n"); + } + else if (pid == 0) + { + if (counter > 0) + dup2(fd_in, 0); //stdin + + if (counter != s_commands->pipelineCapacity) dup2(pipeFd[1], 1); //stdout + + close(pipeFd[0]); + + if (execvp(s_commands->flags[counter][0], s_commands->flags[counter]) == - 1) + { + fprintf(stderr, "ERROR: execvp error, check errno; Command not found.\n"); + } + + exit(-1); + } + else + { + int status = 0; + + waitpid(pid, &status, WNOHANG); + + s_commands->exitStatus[counter] = WEXITSTATUS(status); + + close(pipeFd[1]); + + if (counter > 0) close(fd_in); + + fd_in = pipeFd[0]; + } + } + return; +} diff --git a/task1/homework/pcmd.h b/task1/homework/pcmd.h new file mode 100644 index 0000000..0b87771 --- /dev/null +++ b/task1/homework/pcmd.h @@ -0,0 +1,16 @@ +#ifndef PCMD_H +#define PCMD_H + +#include +#include +#include +#include +#include + +#include "tokenizator.h" + +void run(struct CmdTokens* s_commads); + + + +#endif \ No newline at end of file diff --git a/task1/homework/tokenizator.c b/task1/homework/tokenizator.c new file mode 100644 index 0000000..2af7635 --- /dev/null +++ b/task1/homework/tokenizator.c @@ -0,0 +1,195 @@ +#include "tokenizator.h" + +size_t constructTokens(struct CmdTokens* s_commands) +{ + assert(s_commands); + + s_commands->tokensCapacity = 0; + s_commands->pipelineCapacity = 0; + s_commands->flagsNum = NULL; + + for (int i = 0; i < MAX_NUM_TOKENS; i++) + { + s_commands->tokens[i] = NULL; + } + + return OK; +} + +size_t tokenizator(struct CmdTokens* s_commands) +{ + assert(s_commands); + + char delim[] = " ,;\n"; + + char cmd[CMD_MAX_SIZE] = {}; + + fgets(cmd, CMD_MAX_SIZE, stdin); + + size_t cmdCounter = 0; + char* token = NULL; + char* pos = NULL; + + for (token = godStrtok(cmd, delim, &pos); ((token!=NULL)&(cmdCountertokens[cmdCounter] = token; + + if (strcmp("|", token) == 0) + { + s_commands->pipelineCapacity++; + } + + cmdCounter++; + } + + if (cmdCounter == MAX_NUM_TOKENS) + { + s_commands->tokensCapacity = MAX_NUM_TOKENS + 1; + return MAX_NUM_TOKENS_ERR; + } + + s_commands->tokensCapacity = cmdCounter; + + s_commands->flagsNum = (size_t*)calloc(s_commands->pipelineCapacity + 1, sizeof(size_t)); + s_commands->flags = (char***)calloc(s_commands->pipelineCapacity + 1, sizeof(char***)); + + inputFlags(s_commands, cmdCounter); + + return OK; +} + + +void inputFlags(struct CmdTokens* s_commands, size_t tokensCapcity) +{ + assert(s_commands); + + size_t flagsNum = 0; + size_t pipelineCounter = 0; + + for (size_t flagsCounter = 0; flagsCounter < tokensCapcity; flagsCounter++) + { + if (strcmp(s_commands->tokens[flagsCounter], "|") == 0) + { + s_commands->flagsNum[pipelineCounter] = flagsNum; + pipelineCounter++; + flagsNum = 0; + } + else + { + flagsNum++; + } + } + + s_commands->flagsNum[pipelineCounter] = flagsNum; + + flagsNum = 0; + size_t tokensCounter = 0; + + for (size_t flagsCounter = 0; flagsCounter < s_commands->pipelineCapacity + 1; flagsCounter++) + { + s_commands->flags[flagsCounter] = calloc(s_commands->flagsNum[flagsCounter] + 1, sizeof(char*)); + + for (size_t i = 0; i < s_commands->flagsNum[flagsCounter]; i++) + { + s_commands->flags[flagsCounter][i] = s_commands->tokens[tokensCounter]; + tokensCounter++; + } + s_commands->flags[flagsCounter][s_commands->flagsNum[flagsCounter]] = NULL; + + tokensCounter++; + } +} + +void destructTokens(struct CmdTokens* s_commands) +{ + assert(s_commands); + + for (size_t counter = 0; counter < s_commands->tokensCapacity; counter++) + { + free(s_commands->tokens[counter]); + s_commands->tokens[counter] = NULL; + } + + for (size_t counter = 0; counter < s_commands->pipelineCapacity + 1; counter++) + { + free(s_commands->flags[counter]); + s_commands->flags[counter] = NULL; + } + + free(s_commands->flags); + s_commands->flags = NULL; + + free(s_commands->flagsNum); + s_commands->flags = NULL; +} + +void destructEmptyTokens(struct CmdTokens* s_commands) +{ + for (size_t counter = 0; counter < s_commands->tokensCapacity; counter++) + { + free(s_commands->tokens[counter]); + s_commands->tokens[counter] = NULL; + } +} + + +char* strDuplicator(const char* start, const char* end) +{ + size_t lenStr = end - start; + + char* dup = calloc(lenStr + 1, sizeof(char)); + + if (dup != NULL) + { + strncpy(dup, start, lenStr); + } + + return dup; +} + +char* godStrtok(char* string, char* delimeters, char** pos) +{ + if (string == NULL) + { + string = *pos; + } + + char* walker = string; + char* token = NULL; + + while (*walker != '\0') + { + if (strchr(delimeters, *walker) == 0) + { + walker++; + } + else + { + token = strDuplicator(string, walker); + *pos = walker + strspn(walker, delimeters); + break; + } + } + return token; +} + + +void printTokens(struct CmdTokens* s_commands) +{ + for (size_t i = 0; i < s_commands->pipelineCapacity + 1; i++) + { + printf("flags in %lu pipeline: %lu;\nflags: ", i + 1, s_commands->flagsNum[i]); + + for (size_t j = 0; j < s_commands->flagsNum[i]; j++) + { + printf("%s ", s_commands->flags[i][j]); + } + printf("\n"); + } + + for (size_t i = 0; i < s_commands->pipelineCapacity + 1; i++) + { + printf("exit status of [%lu] process:%d\n", i, s_commands->exitStatus[i]); + } + +} \ No newline at end of file diff --git a/task1/homework/tokenizator.h b/task1/homework/tokenizator.h new file mode 100644 index 0000000..79da6ce --- /dev/null +++ b/task1/homework/tokenizator.h @@ -0,0 +1,52 @@ +#ifndef TOKENIZATOR_H +#define TOKENIZATOR_H + +#include +#include +#include +#include + + +enum CMD +{ + MAX_NUM_TOKENS = 127, + CMD_MAX_SIZE = 256, +}; + +enum CMD_ERRORS +{ + MAX_NUM_TOKENS_ERR = 0x00F, + CONSTRUCT_ERR = 0x01F, + OK = 0x111, +}; + +struct CmdTokens +{ + char* tokens[MAX_NUM_TOKENS + 1]; + char*** flags; + + int exitStatus[MAX_NUM_TOKENS]; + + size_t tokensCapacity; + size_t pipelineCapacity; + + size_t* flagsNum; +}; + +size_t tokenizator(struct CmdTokens* s_commands); + +void inputFlags(struct CmdTokens* s_commands, size_t tokensCapcity); + +size_t constructTokens(struct CmdTokens* s_commands); + +void destructTokens(struct CmdTokens* s_commands); + +void destructEmptyTokens(struct CmdTokens* s_commands); + +char* strDuplicator(const char *start, const char *end); + +char* godStrtok(char* string, char* delimeters, char** pos); + +void printTokens(struct CmdTokens* s_commands); + +#endif \ No newline at end of file From 4cf547e15330e20bf798de2a44e02d1b42484abb Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Tue, 20 Sep 2022 06:37:16 -0700 Subject: [PATCH 06/40] fixed ARG_MAX --- task1/homework/tokenizator.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/task1/homework/tokenizator.h b/task1/homework/tokenizator.h index 79da6ce..e54dccc 100644 --- a/task1/homework/tokenizator.h +++ b/task1/homework/tokenizator.h @@ -9,8 +9,8 @@ enum CMD { - MAX_NUM_TOKENS = 127, - CMD_MAX_SIZE = 256, + MAX_NUM_TOKENS = 1048576, + CMD_MAX_SIZE = 2097152, }; enum CMD_ERRORS From 71aeec7f0f015c6c0d978022eae6685cd5506d6f Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Mon, 26 Sep 2022 14:06:55 -0700 Subject: [PATCH 07/40] based architecture for program --- task2/homework/.gitignore | 4 ++ task2/homework/main.c | 13 ++++++ task2/homework/makefile | 2 + task2/homework/transfer.c | 93 +++++++++++++++++++++++++++++++++++++++ task2/homework/transfer.h | 45 +++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 task2/homework/.gitignore create mode 100644 task2/homework/main.c create mode 100644 task2/homework/makefile create mode 100644 task2/homework/transfer.c create mode 100644 task2/homework/transfer.h diff --git a/task2/homework/.gitignore b/task2/homework/.gitignore new file mode 100644 index 0000000..786bc06 --- /dev/null +++ b/task2/homework/.gitignore @@ -0,0 +1,4 @@ +a.out +file.txt +child.txt +parent.txt \ No newline at end of file diff --git a/task2/homework/main.c b/task2/homework/main.c new file mode 100644 index 0000000..82fed09 --- /dev/null +++ b/task2/homework/main.c @@ -0,0 +1,13 @@ +#include "transfer.h" + + +int main() +{ + Pipe duplex = {}; + + constructPipe(&duplex); + + run(&duplex); + + destructPipe(&duplex); +} \ No newline at end of file diff --git a/task2/homework/makefile b/task2/homework/makefile new file mode 100644 index 0000000..a01edb0 --- /dev/null +++ b/task2/homework/makefile @@ -0,0 +1,2 @@ +all: + gcc main.c transfer.c -D _DEBUG -ggdb3 -O0 -Wall -Wextra -Waggressive-loop-optimizations -Wmissing-declarations -Wcast-align -Wcast-qual -Wchar-subscripts -Wconversion -Wempty-body -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr \ No newline at end of file diff --git a/task2/homework/transfer.c b/task2/homework/transfer.c new file mode 100644 index 0000000..467b1ec --- /dev/null +++ b/task2/homework/transfer.c @@ -0,0 +1,93 @@ +#include "transfer.h" + + +size_t findFileSize(FILE* in) +{ + assert(in); + + size_t fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + +void constructPipe(Pipe* self) +{ + assert(self); + + FILE* parent = fopen("parent.txt", "r"); + + self->len = findFileSize(parent); + + self->actions.rcv = readDuplex; + self->actions.send = writeDuplex; + + fclose(parent); +} + +void destructPipe(Pipe* self) +{ + free(self->dataIn); + free(self->dataOut); +} + + +size_t readDuplex(Pipe* self, int curFd) +{ + return (read(curFd, self->dataIn, self->len)); +} + + +size_t writeDuplex(Pipe* self, int curFd) +{ + return (write(curFd, self->dataIn, self->len)); +} + +void run(Pipe* self) +{ + pipe(self->fdParent); + pipe(self->fdChild); + + pid_t pid = -1; + + if ((pid = fork()) == -1) + { + fprintf(stderr, "ERROR: Can't create new proccess\n"); + } + else if (pid == 0) + { + sleep(1.5); + self->actions.rcv(self, self->fdChild[0]); + self->actions.send(self, self->fdParent[1]); + } + else + { + int status = 0; + + self->dataIn = calloc(self->len, sizeof(char)); + + if (self->dataIn == NULL) fprintf(stderr, "ERROR: can't calloc memory for data on %d LINE", __LINE__); + + FILE* parent = fopen("parent.txt", "r"); + + if (parent == NULL) fprintf(stderr, "ERROR: can't open file with data on %d LINE", __LINE__); + + fread(self->dataIn, sizeof(char), self->len, parent); + + fclose(parent); + + self->actions.send(self, self->fdChild[1]); + + waitpid(pid, &status, 0); + + + + } + + +} \ No newline at end of file diff --git a/task2/homework/transfer.h b/task2/homework/transfer.h new file mode 100644 index 0000000..d9db5c7 --- /dev/null +++ b/task2/homework/transfer.h @@ -0,0 +1,45 @@ +#ifndef TRANSFER_H +#define TRANSFER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct pPipe Pipe; + +typedef struct op_table Ops; + +typedef struct op_table +{ + size_t (*rcv) (Pipe *self, int curFd); + size_t (*send)(Pipe *self, int curFd); +} Ops; + +typedef struct pPipe +{ + char* dataIn; + char* dataOut; + int fdChild[2]; + int fdParent[2]; + size_t len; + Ops actions; +} Pipe; + +void constructPipe(Pipe* self); + +void destructPipe(Pipe* self); + +size_t readDuplexParent(Pipe* self, int curFd); + +size_t writeDuplexChild(Pipe* self, int curFd); + +size_t findFileSize(FILE* f); + +void run(Pipe* self); + +#endif \ No newline at end of file From ea0241446b3fb932c32d8ce2e24b509686cd54d0 Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Tue, 27 Sep 2022 02:00:23 -0700 Subject: [PATCH 08/40] completed --- task1/examples/10_exec_pipes.c | 32 +++++++--- task1/examples/a.out | Bin 0 -> 17160 bytes task1/examples/beta.c | 43 +++++++++++++ task1/homework/main.c | 2 +- task1/homework/tokenizator.c | 62 +++++++++++++++++-- task1/homework/tokenizator.h | 8 ++- task2/homework/main.c | 2 +- task2/homework/transfer.c | 108 +++++++++++++++++++++++---------- task2/homework/transfer.h | 17 +++--- 9 files changed, 217 insertions(+), 57 deletions(-) create mode 100755 task1/examples/a.out create mode 100644 task1/examples/beta.c diff --git a/task1/examples/10_exec_pipes.c b/task1/examples/10_exec_pipes.c index bf77c3a..1814de0 100644 --- a/task1/examples/10_exec_pipes.c +++ b/task1/examples/10_exec_pipes.c @@ -26,27 +26,42 @@ void seq_pipe(char ***cmd) int fd_in = 0; int i = 0; - while (cmd[i] != NULL) { + while (cmd[i] != NULL) + { pipe(p); + printf("New used pipe descriptors: %d %d\n",p[0],p[1]); printf("Input descriptor for current child process: %d\n", fd_in); - if ((pid = fork()) == -1) { + + if ((pid = fork()) == -1) + { exit(1); - } else if (pid == 0) { + } + else if (pid == 0) + { if (i > 0) - dup2(fd_in, 0); //stdin <- read from fd_in (dup / dup2(int oldfd, int newfd) newfd <--copy( oldfd ) ) + dup2(fd_in, 0); //d) newfd <--copy( oldfd ) ) + + fprintf(stdout, "%d\n", fd_in); + if (cmd[i+1] != NULL) dup2(p[1], 1); //stdout -> write to pipe + close(p[0]); + execvp((cmd)[i][0], cmd[i]); exit(2); - } else { + } + else + { wait(NULL); close(p[1]); + if (i>0) close(fd_in); // old pipe from previous step is not used further, and can be destroyed + fd_in = p[0]; //fd_in <--read from pipe - i++; + i++; } } return; @@ -56,8 +71,7 @@ int main() { char *ls[] = {"/bin/ls","-ltr",".", NULL}; char *grep1[] = {"grep","rw",NULL}; - char *grep2[] = {"grep","1", NULL}; + char **cmd[] = {ls, grep1, NULL}; + seq_pipe(cmd); char *grep2[] = {"grep","1", NULL}; char *grep3[] = {"grep", "89", NULL}; - char **cmd[] = {ls, grep1, grep2, grep3, NULL}; - seq_pipe(cmd); } diff --git a/task1/examples/a.out b/task1/examples/a.out new file mode 100755 index 0000000000000000000000000000000000000000..d6fcfdef5fca6f217d422eaa053d97f9918d7be0 GIT binary patch literal 17160 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 +#include +#include +#include + +void seq_pipe(char ***cmd) +{ + int pipe_fd[2] = {-1, -1}; + pid_t pid ; + int fd_in = 0; + int i = 0; + + + + + return; +} + +int main() +{ + char *ls[] = {"/bin/ls","-ltr",".", NULL}; + char *grep1[] = {"grep","rw",NULL}; + char *grep2[] = {"grep","1", NULL}; + char *grep3[] = {"grep", "89", NULL}; + char **cmd[] = {ls, grep1, grep2, grep3, NULL}; + seq_pipe(cmd); +} diff --git a/task1/homework/main.c b/task1/homework/main.c index a3023ac..a12a298 100644 --- a/task1/homework/main.c +++ b/task1/homework/main.c @@ -20,7 +20,7 @@ int main() destructEmptyTokens(&s_cmd); return MAX_NUM_TOKENS_ERR; } - + run(&s_cmd); destructTokens(&s_cmd); diff --git a/task1/homework/tokenizator.c b/task1/homework/tokenizator.c index 2af7635..84b0c1a 100644 --- a/task1/homework/tokenizator.c +++ b/task1/homework/tokenizator.c @@ -32,14 +32,37 @@ size_t tokenizator(struct CmdTokens* s_commands) for (token = godStrtok(cmd, delim, &pos); ((token!=NULL)&(cmdCountertokens[cmdCounter] = token; - if (strcmp("|", token) == 0) { s_commands->pipelineCapacity++; + s_commands->tokens[cmdCounter] = token; + cmdCounter++; + } + else if (strchr(token, '|') != NULL) + { + char* tokenBefore = fixBeforeTok(token); + char* tokenAfter = fixAfterTok(token, delim); + free(token); + s_commands->tokens[cmdCounter] = tokenBefore; + s_commands->pipelineCapacity++; + cmdCounter++; + char* tmp = (char*)calloc(2, sizeof(char)); + tmp[0] = '|'; + tmp[1] = '\0'; + s_commands->tokens[cmdCounter] = tmp; + cmdCounter++; + + if (tokenAfter != NULL) + { + s_commands->tokens[cmdCounter]; + cmdCounter++; + } + } + else + { + s_commands->tokens[cmdCounter] = token; + cmdCounter++; } - - cmdCounter++; } if (cmdCounter == MAX_NUM_TOKENS) @@ -174,6 +197,37 @@ char* godStrtok(char* string, char* delimeters, char** pos) } +char* fixBeforeTok(char* token) +{ + char* pos = strchr(token, '|'); + + char* result = strDuplicator(token, pos); + + return result; +} + +char* fixAfterTok(char* token, char* delim) +{ + char* tmp = strchr(token, '|'); + + if (strlen(tmp) == 1) + { + return NULL; + } + else + { + char* walker = tmp; + while (strchr(walker, *delim) == 0) + { + walker++; + } + + char* result = strDuplicator(tmp + 1, walker); + + return result; + } +} + void printTokens(struct CmdTokens* s_commands) { for (size_t i = 0; i < s_commands->pipelineCapacity + 1; i++) diff --git a/task1/homework/tokenizator.h b/task1/homework/tokenizator.h index e54dccc..0d6c4ee 100644 --- a/task1/homework/tokenizator.h +++ b/task1/homework/tokenizator.h @@ -9,8 +9,8 @@ enum CMD { - MAX_NUM_TOKENS = 1048576, - CMD_MAX_SIZE = 2097152, + MAX_NUM_TOKENS = 256, + CMD_MAX_SIZE = 155, }; enum CMD_ERRORS @@ -47,6 +47,10 @@ char* strDuplicator(const char *start, const char *end); char* godStrtok(char* string, char* delimeters, char** pos); +char* fixBeforeTok(char* token); + +char* fixAfterTok(char* token, char* delim); + void printTokens(struct CmdTokens* s_commands); #endif \ No newline at end of file diff --git a/task2/homework/main.c b/task2/homework/main.c index 82fed09..82c6940 100644 --- a/task2/homework/main.c +++ b/task2/homework/main.c @@ -9,5 +9,5 @@ int main() run(&duplex); - destructPipe(&duplex); + free(duplex.dataIn); } \ No newline at end of file diff --git a/task2/homework/transfer.c b/task2/homework/transfer.c index 467b1ec..ef9a464 100644 --- a/task2/homework/transfer.c +++ b/task2/homework/transfer.c @@ -1,5 +1,9 @@ #include "transfer.h" +#define $$ fprintf(stdout, "HERE %d\n", __LINE__); + + +const size_t MAXBUFSIZE = 65536; size_t findFileSize(FILE* in) { @@ -20,9 +24,14 @@ void constructPipe(Pipe* self) { assert(self); - FILE* parent = fopen("parent.txt", "r"); + FILE* parent = fopen("file.txt", "r"); + + self->len = findFileSize(parent); + self->lenParts = self->len / MAXBUFSIZE; - self->len = findFileSize(parent); + self->dataIn = calloc(MAXBUFSIZE, sizeof(char)); + + if (self->dataIn == NULL) fprintf(stderr, "ERROR: can't calloc memory for data on %d LINE", __LINE__); self->actions.rcv = readDuplex; self->actions.send = writeDuplex; @@ -30,22 +39,20 @@ void constructPipe(Pipe* self) fclose(parent); } -void destructPipe(Pipe* self) -{ - free(self->dataIn); - free(self->dataOut); -} - -size_t readDuplex(Pipe* self, int curFd) +ssize_t readDuplex(Pipe* self, int curFd, size_t PartOfBuffer) { - return (read(curFd, self->dataIn, self->len)); + ssize_t tmp = read(curFd, self->dataIn, MAXBUFSIZE); + + return (tmp); } -size_t writeDuplex(Pipe* self, int curFd) +ssize_t writeDuplex(Pipe* self, int curFd, size_t PartOfBuffer) { - return (write(curFd, self->dataIn, self->len)); + ssize_t tmp = write(curFd, self->dataIn, MAXBUFSIZE); + + return (tmp); } void run(Pipe* self) @@ -53,6 +60,8 @@ void run(Pipe* self) pipe(self->fdParent); pipe(self->fdChild); + size_t tmpSize = self->len; + pid_t pid = -1; if ((pid = fork()) == -1) @@ -61,33 +70,66 @@ void run(Pipe* self) } else if (pid == 0) { - sleep(1.5); - self->actions.rcv(self, self->fdChild[0]); - self->actions.send(self, self->fdParent[1]); + close(self->fdChild[1]); + close(self->fdParent[0]); + //---------------------------------------------------------------- + + for (size_t i = 0; i < self->lenParts; i++) + self->actions.rcv(self, self->fdChild[0], i); + + if ((tmpSize - MAXBUFSIZE * self->lenParts) != 0) + { + self->actions.rcv(self, self->fdChild[0], self->lenParts); + } + //---------------------------------------------------------------- + + for (size_t i = 0; i < self->lenParts; i++) + { + self->actions.send(self, self->fdParent[1], i); + fprintf(stdout, "%lu\n", i); + } + if ((tmpSize - MAXBUFSIZE * self->lenParts) != 0) + { + self->actions.send(self, self->fdParent[1], self->lenParts); + } + + //---------------------------------------------------------------- } else { - int status = 0; - - self->dataIn = calloc(self->len, sizeof(char)); - - if (self->dataIn == NULL) fprintf(stderr, "ERROR: can't calloc memory for data on %d LINE", __LINE__); - FILE* parent = fopen("parent.txt", "r"); - if (parent == NULL) fprintf(stderr, "ERROR: can't open file with data on %d LINE", __LINE__); - - fread(self->dataIn, sizeof(char), self->len, parent); - + //-------------------------------------------------------------------------------------------------------------- + + for (size_t i = 0; i < self->lenParts; i++) + { + fread(self->dataIn, sizeof(char), MAXBUFSIZE, parent); + self->actions.send(self, self->fdChild[1], i); + fprintf(stdout, "%lu\n", i); + } + if ((self->len - MAXBUFSIZE * self->lenParts) != 0) + { + fread(self->dataIn, sizeof(char), MAXBUFSIZE, parent); + self->actions.send(self, self->fdChild[1], self->lenParts); + } + //-------------------------------------------------------------------------------------------------------------- fclose(parent); - - self->actions.send(self, self->fdChild[1]); - - waitpid(pid, &status, 0); - - + FILE* child = fopen("child.txt", "w"); + if (child == NULL) fprintf(stderr, "ERROR: can't open file with data on %d LINE", __LINE__); + + for (size_t i = 0; i < self->lenParts; i++) + { + self->actions.rcv(self, self->fdParent[0], i); + fwrite(self->dataIn, sizeof(char), MAXBUFSIZE, child); + } + if ((self->len - MAXBUFSIZE * self->lenParts) != 0) + { + self->actions.rcv(self, self->fdParent[0], self->lenParts); + fwrite(self->dataIn, sizeof(char), MAXBUFSIZE, child); + } + //-------------------------------------------------------------------------------------------------------------- + + fclose(child); } - - } \ No newline at end of file diff --git a/task2/homework/transfer.h b/task2/homework/transfer.h index d9db5c7..f3f4c4b 100644 --- a/task2/homework/transfer.h +++ b/task2/homework/transfer.h @@ -10,33 +10,36 @@ #include #include + typedef struct pPipe Pipe; typedef struct op_table Ops; typedef struct op_table { - size_t (*rcv) (Pipe *self, int curFd); - size_t (*send)(Pipe *self, int curFd); + ssize_t (*rcv) (Pipe *self, int curFd, size_t PartOfBuffer); + ssize_t (*send)(Pipe *self, int curFd, size_t PartOfBuffer); } Ops; typedef struct pPipe { char* dataIn; - char* dataOut; + char* dataOut; + int fdChild[2]; int fdParent[2]; + size_t len; + size_t lenParts; + Ops actions; } Pipe; void constructPipe(Pipe* self); -void destructPipe(Pipe* self); - -size_t readDuplexParent(Pipe* self, int curFd); +ssize_t readDuplex(Pipe* self, int curFd, size_t PartOfBuffer); -size_t writeDuplexChild(Pipe* self, int curFd); +ssize_t writeDuplex(Pipe* self, int curFd, size_t PartOfBuffer); size_t findFileSize(FILE* f); From dc5d08d3f41d461ee7a628acd7129088e3e4e4ea Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Tue, 27 Sep 2022 12:33:18 -0700 Subject: [PATCH 09/40] cosmetics --- task2/homework/transfer.c | 22 ++++++++++------------ task2/homework/transfer.h | 8 ++++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/task2/homework/transfer.c b/task2/homework/transfer.c index ef9a464..f6e57fc 100644 --- a/task2/homework/transfer.c +++ b/task2/homework/transfer.c @@ -40,7 +40,7 @@ void constructPipe(Pipe* self) } -ssize_t readDuplex(Pipe* self, int curFd, size_t PartOfBuffer) +ssize_t readDuplex(Pipe* self, int curFd) { ssize_t tmp = read(curFd, self->dataIn, MAXBUFSIZE); @@ -48,7 +48,7 @@ ssize_t readDuplex(Pipe* self, int curFd, size_t PartOfBuffer) } -ssize_t writeDuplex(Pipe* self, int curFd, size_t PartOfBuffer) +ssize_t writeDuplex(Pipe* self, int curFd) { ssize_t tmp = write(curFd, self->dataIn, MAXBUFSIZE); @@ -75,22 +75,21 @@ void run(Pipe* self) //---------------------------------------------------------------- for (size_t i = 0; i < self->lenParts; i++) - self->actions.rcv(self, self->fdChild[0], i); + self->actions.rcv(self, self->fdChild[0]); if ((tmpSize - MAXBUFSIZE * self->lenParts) != 0) { - self->actions.rcv(self, self->fdChild[0], self->lenParts); + self->actions.rcv(self, self->fdChild[0]); } //---------------------------------------------------------------- for (size_t i = 0; i < self->lenParts; i++) { - self->actions.send(self, self->fdParent[1], i); - fprintf(stdout, "%lu\n", i); + self->actions.send(self, self->fdParent[1]); } if ((tmpSize - MAXBUFSIZE * self->lenParts) != 0) { - self->actions.send(self, self->fdParent[1], self->lenParts); + self->actions.send(self, self->fdParent[1]); } //---------------------------------------------------------------- @@ -104,13 +103,12 @@ void run(Pipe* self) for (size_t i = 0; i < self->lenParts; i++) { fread(self->dataIn, sizeof(char), MAXBUFSIZE, parent); - self->actions.send(self, self->fdChild[1], i); - fprintf(stdout, "%lu\n", i); + self->actions.send(self, self->fdChild[1]); } if ((self->len - MAXBUFSIZE * self->lenParts) != 0) { fread(self->dataIn, sizeof(char), MAXBUFSIZE, parent); - self->actions.send(self, self->fdChild[1], self->lenParts); + self->actions.send(self, self->fdChild[1]); } //-------------------------------------------------------------------------------------------------------------- fclose(parent); @@ -120,12 +118,12 @@ void run(Pipe* self) for (size_t i = 0; i < self->lenParts; i++) { - self->actions.rcv(self, self->fdParent[0], i); + self->actions.rcv(self, self->fdParent[0]); fwrite(self->dataIn, sizeof(char), MAXBUFSIZE, child); } if ((self->len - MAXBUFSIZE * self->lenParts) != 0) { - self->actions.rcv(self, self->fdParent[0], self->lenParts); + self->actions.rcv(self, self->fdParent[0]); fwrite(self->dataIn, sizeof(char), MAXBUFSIZE, child); } //-------------------------------------------------------------------------------------------------------------- diff --git a/task2/homework/transfer.h b/task2/homework/transfer.h index f3f4c4b..ff7101c 100644 --- a/task2/homework/transfer.h +++ b/task2/homework/transfer.h @@ -17,8 +17,8 @@ typedef struct op_table Ops; typedef struct op_table { - ssize_t (*rcv) (Pipe *self, int curFd, size_t PartOfBuffer); - ssize_t (*send)(Pipe *self, int curFd, size_t PartOfBuffer); + ssize_t (*rcv) (Pipe *self, int curFd); + ssize_t (*send)(Pipe *self, int curFd); } Ops; typedef struct pPipe @@ -37,9 +37,9 @@ typedef struct pPipe void constructPipe(Pipe* self); -ssize_t readDuplex(Pipe* self, int curFd, size_t PartOfBuffer); +ssize_t readDuplex(Pipe* self, int curFd); -ssize_t writeDuplex(Pipe* self, int curFd, size_t PartOfBuffer); +ssize_t writeDuplex(Pipe* self, int curFd); size_t findFileSize(FILE* f); From 671a1d5aa91bc7a6b99aeab581b75c1fefe6802f Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Thu, 29 Sep 2022 04:29:23 -0700 Subject: [PATCH 10/40] deleted unused variables --- task2/homework/transfer.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/task2/homework/transfer.h b/task2/homework/transfer.h index ff7101c..18568a6 100644 --- a/task2/homework/transfer.h +++ b/task2/homework/transfer.h @@ -24,8 +24,7 @@ typedef struct op_table typedef struct pPipe { char* dataIn; - char* dataOut; - + int fdChild[2]; int fdParent[2]; From b8c522301a34ab6e52ceda366264ec28db42d0e5 Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Thu, 13 Oct 2022 15:01:25 -0700 Subject: [PATCH 11/40] compeleted MQ and SM --- task2/homework/transfer.c | 3 +- task3/homework/FIFO_receiver.c | 0 task3/homework/FIFO_sender.c | 0 task3/homework/input.txt | 1 + task3/homework/mqSYSV_receiver.c | 51 ++++++++++++++ task3/homework/mqSYSV_receiver.out | Bin 0 -> 17144 bytes task3/homework/mqSYSV_sender.c | 105 +++++++++++++++++++++++++++++ task3/homework/mqSYSV_sender.out | Bin 0 -> 17408 bytes task3/homework/output.txt | 0 task3/homework/shmClientPOSIX.c | 72 ++++++++++++++++++++ task3/homework/shmClientPOSIX.out | Bin 0 -> 17456 bytes task3/homework/shmServerPOSIX.c | 37 ++++++++++ task3/homework/shmServerPOSIX.out | Bin 0 -> 16968 bytes task3/test.c | 18 +++++ task3/test1.c | 15 +++++ 15 files changed, 300 insertions(+), 2 deletions(-) create mode 100644 task3/homework/FIFO_receiver.c create mode 100644 task3/homework/FIFO_sender.c create mode 100644 task3/homework/input.txt create mode 100644 task3/homework/mqSYSV_receiver.c create mode 100755 task3/homework/mqSYSV_receiver.out create mode 100644 task3/homework/mqSYSV_sender.c create mode 100755 task3/homework/mqSYSV_sender.out create mode 100644 task3/homework/output.txt create mode 100644 task3/homework/shmClientPOSIX.c create mode 100755 task3/homework/shmClientPOSIX.out create mode 100644 task3/homework/shmServerPOSIX.c create mode 100755 task3/homework/shmServerPOSIX.out create mode 100644 task3/test.c create mode 100644 task3/test1.c diff --git a/task2/homework/transfer.c b/task2/homework/transfer.c index f6e57fc..2584487 100644 --- a/task2/homework/transfer.c +++ b/task2/homework/transfer.c @@ -24,7 +24,7 @@ void constructPipe(Pipe* self) { assert(self); - FILE* parent = fopen("file.txt", "r"); + FILE* parent = fopen("parent.txt", "r"); self->len = findFileSize(parent); self->lenParts = self->len / MAXBUFSIZE; @@ -43,7 +43,6 @@ void constructPipe(Pipe* self) ssize_t readDuplex(Pipe* self, int curFd) { ssize_t tmp = read(curFd, self->dataIn, MAXBUFSIZE); - return (tmp); } diff --git a/task3/homework/FIFO_receiver.c b/task3/homework/FIFO_receiver.c new file mode 100644 index 0000000..e69de29 diff --git a/task3/homework/FIFO_sender.c b/task3/homework/FIFO_sender.c new file mode 100644 index 0000000..e69de29 diff --git a/task3/homework/input.txt b/task3/homework/input.txt new file mode 100644 index 0000000..5d4caa3 --- /dev/null +++ b/task3/homework/input.txt @@ -0,0 +1 @@ +12345 TYTA \ No newline at end of file diff --git a/task3/homework/mqSYSV_receiver.c b/task3/homework/mqSYSV_receiver.c new file mode 100644 index 0000000..bf0bd8e --- /dev/null +++ b/task3/homework/mqSYSV_receiver.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_KEY 1337 +#define MAX_MSG_SIZE 4096 +#define DEFAULT_TYPE 1488 + +typedef struct msgbuf { + long mtype; + char mtext[MAX_MSG_SIZE]; +} message_buf; + + +void dump_data(char* buf, int size) +{ + FILE* out = fopen("output.txt", "wb"); + if (!out) + { + fprintf(stderr,"File can't be created\n"); + return; + } + + fwrite(buf, sizeof(char), size, out); + fclose(out); +} + + +int main() +{ + int msqid = -1; + key_t key = DEFAULT_KEY; + message_buf rbuf; + + if ((msqid = msgget(key, 0666)) < 0) { + perror("msgget"); + exit(1); + } + + if (msgrcv(msqid, &rbuf, MAX_MSG_SIZE, DEFAULT_TYPE, 0) < 0) { + perror("msgrcv"); + exit(1); + } + + printf("MSG: \'%s\'\n", rbuf.mtext); + +} \ No newline at end of file diff --git a/task3/homework/mqSYSV_receiver.out b/task3/homework/mqSYSV_receiver.out new file mode 100755 index 0000000000000000000000000000000000000000..32bd963c503703493645518afe830220f12478d4 GIT binary patch literal 17144 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 +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_KEY 1337 +#define DEFAULT_TYPE 1488 +#define MAX_MSG_SIZE 4096 + +enum errors +{ + OVERFLOW_MSG_ERR = -2, + FILE_ERR = -1, + OK = 0 +}; + +typedef struct msgbuf { + long mtype; + char mtext[MAX_MSG_SIZE]; + } message_buf; + + +int findFileSize(FILE* in) +{ + assert(in); + + int fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + +int initMsgBuf(struct msgbuf* sbuf, size_t* buf_length) +{ + sbuf->mtype = DEFAULT_TYPE; + + FILE* in = NULL; + if (in = fopen("input.txt", "rb")) + { + *buf_length = findFileSize(in); + + if (*buf_length >= MAX_MSG_SIZE) return OVERFLOW_MSG_ERR; + + fread(sbuf->mtext, sizeof(char), *buf_length, in); + sbuf->mtext[*buf_length] = '\0'; + + fclose(in); + + return OK; + } + else + { + fprintf(stderr, "File not found\n"); + return FILE_ERR; + } +} + + +int main() +{ + int msqid = -1; + int msgflg = IPC_CREAT | 0666; + key_t key = DEFAULT_KEY; + message_buf sbuf; + size_t buf_length = 0; + + if ((msqid = msgget(key, msgflg)) < 0) { + perror("msgget"); + exit(1); + } + else + printf("msgget: msgget succeeded: msqid = %d\n", msqid); + + + int err = initMsgBuf(&sbuf, &buf_length); + + if (err == OVERFLOW_MSG_ERR) + { + fprintf(stderr, "MESSAGE TOO BIG\n"); + return OVERFLOW_MSG_ERR; + } + if (err == FILE_ERR) + { + return FILE_ERR; + } + + if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) { + printf ("%d, %ld, %s, %ld\n", msqid, sbuf.mtype, sbuf.mtext, buf_length); + perror("msgsnd"); + exit(1); + } + + printf("MSG %s \n", sbuf.mtext); + + return 0; +} diff --git a/task3/homework/mqSYSV_sender.out b/task3/homework/mqSYSV_sender.out new file mode 100755 index 0000000000000000000000000000000000000000..5538d9969ed4db36dfe1d606f1886a46d1f5a36f GIT binary patch literal 17408 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 iyKQOzUZNKZNbmLtxm;UH&;HfzZ@ +#include +#include +#include +#include +#include +#include +#include + +const char* name = "HESOYAM"; + +#define SIZE 4096 + +int findFileSize(FILE* in) +{ + assert(in); + + int fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + + +int main() +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); + + ftruncate(shm_fd, SIZE); + + ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + char inBuf[SIZE]; + + FILE* in = fopen("input.txt", "r"); + if (!in) + { + fprintf(stderr, "File not found\n"); + return 1; + } + + int file_size = findFileSize(in); + + if (file_size >= SIZE) + { + fprintf(stderr, "DATA TOO BIG\n"); + return 1; + } + + fread(inBuf, sizeof(char), file_size, in); + inBuf[file_size] = '\0'; + fclose(in); + + sprintf(ptr, "%s", inBuf); + + return 0; +} \ No newline at end of file diff --git a/task3/homework/shmClientPOSIX.out b/task3/homework/shmClientPOSIX.out new file mode 100755 index 0000000000000000000000000000000000000000..7094bd16ff9d10c05a8e284985d99af8a519aced GIT binary patch literal 17456 zcmeHPe{dAl9e<2R&6|gOsc^3^L_iio89G3 zTc^{%?lGJ1`+mMZ-h1Eo_U*pg_xMg*XM0T`AUFlZ{!Al-N%X*VqE4bxJP?N_GvDDML@UVZoGZNR;dvWoZ9 zr=?H`rYv{L)5sV}lYbpLN(x9!-F6h4NRt$c$Wkxmc#Ns|upO~v*QM;blpRyS`igQq zDJFC+QStOs4Khla{40dt?rLS{r>#n#DV0HK-CI`tijI<-Mm(nSE(QNsyH%L-6<~YPi$Dc@WTFhQ-30v-PE*c$>OHP3&WXIc!8_})r-oY zVY6b@dg_+FgsCvfzL=$WlD`!0dF9@W_2Rv&9tz#jbm(ud{pQJy?1RcA9ZF=+T}(XX zzl4i)WcveKkrOq9k^e*H3j>!Fhxs-knI}yHr+E;Yc^*XF;vVUm3i$2{_}vxoUsb?w zseu2u0{%t?e0v4F5x9oSpB@2FuDv%^z$wb*^b-~Ecm@2K3i!pqHC+DmB7n2~AowS6 z%@lKl7O{nV{|b!Lv_<1`zA!qvR~m6MZEj3tEHmA`a(RC$X?Djp^qaykHV&kcM#hSz zEyJ)?%PMC228`68nIy+OhrQw*BvbSf=+EwjHL zrJ#VG8;zd68;#yrf`C{iW1>jO4GhEvMQ_G5Zxp>f{i%#8G8XC!>s!(Z`07oYu{dmc zHpPtIL^9T&xRq*7HBmJmh$WI@MQ2CLa$`YwL3ojqUns*;gZrlj_g;O*| z0r}6qhc)ooISD*Dg5pCGA_ZXebx@v1W+f8S%w^qk@%nspXt)CW~&jXMxYvjY6Pkg z_7YLJRNa1Ajnbk8fQzMh7lF)}D@ebOB*nt( zrBZ2!W9>~nZ}5hxZOc6fRLC>9=YczW;`3*U2idf*oeTOFPr^u@wW z4o?sGVj<@6^x{)2tZ{gH&=(6)ho={yVqw0+(*wU)ILqPbL0>G)WFD=3HB7B-6|%kH zm-_fcKEBDv&-3wT`1sjAe!7pZ_3=lWy!H9W$G_|2-}3RV`uIP&`T6g5%j-EgRN6O*%xkskTUCGhrzDt zx!dyk&~15>$0e6LkdH%1 zsE)jje6Hfv?WY_2%*EW6*GHP(1iY^EyrVS7=I{9gMeI8owC2u#S=}F=ANOcnDo@Q2SgaZ+1HpKy=@ zrv)$T1f`|>ZoFx40ex_+RC{#sn)(36G)A`x!kqQ$}}C?_iGE?f_wyxRzD3)SCQvwZsG z8VfbD>+%rbW03!a>dx}u3jtEVPYmJ@xORU~D#<{#hwAUC=?FF49c&9}Ba_-fjd#_y zhMMo3tcR8iO<56&BtuK0q2_3)u_dIngc@2x^(~<~`JHMO{Exzq`#TC;S5q|t)d*B0 zP>nz}0@VmqBT$V%H3HQL{Es5Q`@DExms*}Ud$gFRy=0W8*~HmcMxQq*?VfGZQ*Gkx z7d}n#v~Hp_$0maJmC^cx63ah2R!R|nKYepW;m*9NH|rFe6-!hF8P`>Y>n+!0(B(aBT>hELp7lO0+3iDd z62j*r+1_#0FnmFhJl6|LOUeIU$^WJJNy_j4nmGHkeU6*eVltv=m!dZ)I;iLtMRzEA zzoNSo-K*$9MMo7KQxuy-zfj`+hrHi##q#BsYK`kRWRq4_yCl3Y+}t!jE4lf%FK7-o zFAUE=&&EH$xFGI^1~uN?+O$`b_o;jFpx}MzUVM`Hc3D5Q&Up9gPZm7Rz4#Qt_k$O& z6Fg45_z8l?mlvNZcpQ826P@wy#c}s@Ke+@!oTkvq;vrFArayyXhS195aN^$7smcgq zQ1JZXDi*t4p{%(PJ0HZ3^S-k9EU~*RKHHhE+}?uXWM`i8;-`pm_eoGR2%cBG`j{0X zZp6+9UHhTk(xBj3a{{I5X_9zfeo>!5?fJL{ozm=!TL?;o-{8Z~QaI1|?2Gnu2T-5J zh>cKrl-h9x%EVy+IQbv-`QI${kB{e0;N|N7bE$ulxLQL7iJvEx+WRDQ0{AuS6>5kt zmGgg4>dZc_A72L^5Xbl9+e)AJLvs;FW#;&CRga2db~vuzQ<%VO=xOP@FTMi(lK}2g z4<>%TEe5V}VJ><){Al9%@v~O?aVe^-SpokR@Ot=Zh@S5ZAyZb8WKT-jI zssjFU1^i>+Gf~faRZr)+SwVje;zR8czIL4p+&463!!MQb^u~a=4&XCuP8IwdVT~&Z zCr_G<@N?Ic{_90V^`of_UIDGgebgLLfFhdG=Sp3u@T|nWy2Nbu3KMS~qdihfr_}P9C{1xN} zanK^RkjI1QNn05!i=8DsV&ce%VGS5Kn2|IyICc?F85{dk8)E%N+)AZ0Ml8EY^rQv` z`%TM?hnF-j#)*@1N_2E1VZ_qu*k%JC64IM-t|K;J8u9GFz-E}ZI0KrNNAEg;ON0*Q|=J>{#xV$n!6N zaNNph)0GFkb*(T~bgpiRb{ebO+t;;q8{N^C&NlKY&z|&Tva(U1dBR2>UWr89hg0}0 zjTbe{c+85a6EHrJ@BGY!bfNqTGr`l@7v~U;7xtXF@rsh@2X2&o6o?Mgcy-XHsGfb^ z#y-~LmwQhV8SzZY=!+%ebjqk>H4Nj4q>;^-bdtvjA9b{S^vCaQLnfmNlZSgeACBZ< zBd>vd-pGrovq@f%PAz#6`;?IvGYlM);xR<$r^+6R@*YX@da#c$c`*^rY#y*;8$hkJ zP5U^9Q&eVpP=xXQ%nWZ#X2XMN9H~lMn_bX`Yyu|_6LAGaTRNJo*hV4M`(l|s5sq(8 zq6nK>X~?3>rN;5>?o4J6>qHb)1GFeZ)xOa^6UsQ(V4H#$rvOTXqm}-!@lQUl`a51Rc{%Xvxl$g?YMt9=p9b+BHxb1m8!&GBM zMg8_y0sk0lSgt>>^O-g(J6`Ae>mP%h*7$7C>m#P)6kH^#BW2m1*W(Fb)MU2jbre(n z9RVsbDR<0@n~?H>R}F=79BNwJfn{*{Zr|9|AO*OVPouD|l? zcQ1bCv*-1tL)lPKU-iT;pS`Bmp-e|V$9|8`p5Nz~{#M;j?1sx{o^~#~IoVyZ_ABNsS zhSsJWCSGUp`F6iP^Gx4|?F^Sa|Bk3P0YqXwo15Snr*#~ST`r&3@%;Z4aA4^Eqr`UH zkG}*)O?2$l?}%OMg`UQjJFz{}$uM@?i-^*0wkhAI?1Sx?p9W*XxO^>QOB$3t*OT=% z&L}!lm9NwtDcfJ*Aa;i8O36)m?AQ|fudW>KQh_@IFolHc&+R$^7}wplwEvFN4-iP# Y`-EJsEv2 +#include +#include +#include +#include +#include + +const char* name = "HESOYAM"; + +#define SIZE 4096 + +int main() +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_RDONLY, 0666); + + ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + printf("%s", (char*)ptr); + + shm_unlink(name); + return 0; +} \ No newline at end of file diff --git a/task3/homework/shmServerPOSIX.out b/task3/homework/shmServerPOSIX.out new file mode 100755 index 0000000000000000000000000000000000000000..b683abbb8260e4f77f59768e98c95779fc6ee154 GIT binary patch literal 16968 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 F{sH*H4Uqr< literal 0 HcmV?d00001 diff --git a/task3/test.c b/task3/test.c new file mode 100644 index 0000000..7104b16 --- /dev/null +++ b/task3/test.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include + +int main() +{ + sem_t* s = sem_open("/sem1", O_CREAT | 0644); + + if (s != SEM_FAILED) + sem_init(s, 1, 5); + else + perror("sem_open"); + + sem_post(s); + sem_post(s); + return 0; +} \ No newline at end of file diff --git a/task3/test1.c b/task3/test1.c new file mode 100644 index 0000000..1531786 --- /dev/null +++ b/task3/test1.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include + +int main() +{ + sem_t* s = sem_open("/sem1", O_RDWR); + + sem_wait(s); + + printf("Leaving semaphore %lu\n", getpid()); + return 0; +} \ No newline at end of file From 95e56af8f24d0733b6670ac5ef43a86806b96b58 Mon Sep 17 00:00:00 2001 From: Daniil Paramonov Date: Sat, 15 Oct 2022 14:47:19 -0700 Subject: [PATCH 12/40] completed all programs, TODO start.py --- task3/homework/.vscode/settings.json | 7 ++++ task3/homework/FIFO_receiver.c | 47 ++++++++++++++++++++++++ task3/homework/FIFO_receiver.out | Bin 0 -> 17080 bytes task3/homework/FIFO_sender.c | 51 +++++++++++++++++++++++++++ task3/homework/FIFO_sender.out | Bin 0 -> 17024 bytes task3/homework/input.txt | 1 - task3/homework/mqSYSV_receiver.out | Bin 17144 -> 17144 bytes task3/homework/output.txt | 0 task3/homework/shmClientPOSIX.c | 50 +++++++++++++++++++++----- task3/homework/shmClientPOSIX.out | Bin 17456 -> 17360 bytes task3/homework/shmServerPOSIX.c | 27 ++++++++++++-- task3/homework/shmServerPOSIX.out | Bin 16968 -> 17144 bytes 12 files changed, 170 insertions(+), 13 deletions(-) create mode 100644 task3/homework/.vscode/settings.json create mode 100755 task3/homework/FIFO_receiver.out create mode 100755 task3/homework/FIFO_sender.out delete mode 100644 task3/homework/input.txt delete mode 100644 task3/homework/output.txt diff --git a/task3/homework/.vscode/settings.json b/task3/homework/.vscode/settings.json new file mode 100644 index 0000000..eecf15b --- /dev/null +++ b/task3/homework/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "files.associations": { + "stat.h": "c", + "stdlib.h": "c", + "unistd.h": "c" + } +} \ No newline at end of file diff --git a/task3/homework/FIFO_receiver.c b/task3/homework/FIFO_receiver.c index e69de29..269c1ec 100644 --- a/task3/homework/FIFO_receiver.c +++ b/task3/homework/FIFO_receiver.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include + +#define FIFO "fifo" + +#define DEFAULT_SIZE = 4096 + +#define MEDIUM_SIZE + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 65536 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + + +int main() +{ + mknod(FIFO, S_IFIFO | 0666, 0); + printf("Waiting for a writer\n"); + int fd = open(FIFO, O_RDONLY); + printf("A writer is connected\n"); + + int size = 0; + char buf[SIZE]; + + FILE* out = fopen("output.txt", "w"); + + while (( size = read(fd, buf, sizeof(buf))) > 0) + { + fwrite(buf, sizeof(char), size, out); + } + + close(fd); + fclose(out); + return 0; +} \ No newline at end of file diff --git a/task3/homework/FIFO_receiver.out b/task3/homework/FIFO_receiver.out new file mode 100755 index 0000000000000000000000000000000000000000..df9dd14b7b7aff2c00903b93767e32995b7097a5 GIT binary patch literal 17080 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 S?NQqPkDD!xl`aF9DE +#include +#include +#include +#include +#include + + +#define DEFAULT_SIZE 4096 +#define FIFO "fifo" + +#define MEDIUM_SIZE + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 65536 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + + +int main() +{ + mknod(FIFO, S_IFIFO | 0666, 0); + printf("Waiting for a reader\n"); + int fd_FIFO = open(FIFO, O_WRONLY); + int fd_in = open("input.txt", O_RDONLY); + printf("A reader is connected\n"); + + int size = 0; + char buf[SIZE]; + + #ifndef LARGE_SIZE + + while (( size = read(fd_in, buf, sizeof(buf))) > 0) + { + write(fd_FIFO, buf, size); + } + + close(fd_FIFO); + close(fd_in); + + #endif + + return 0; +} \ No newline at end of file diff --git a/task3/homework/FIFO_sender.out b/task3/homework/FIFO_sender.out new file mode 100755 index 0000000000000000000000000000000000000000..1a5613495e0c109667f02403c30a7604aba4486d GIT binary patch literal 17024 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 ZgYoL*NPB%w3lWeN3=9^VC)%eo0|3;aU{e49 delta 328 zcmey-%J`#|aRUbf5;L*z)zqw9OfvMi3xAnvO|NlLj4{+>b5CF<_9)B_U-~azRK!$mAhyFy6BM&M0 za$QTth|L>y^;v+_L&NP%i~*Bpn)EY9Ox85r&-h^SOVfHL9>&dCX74x{zfO*{*XN87 O0egWVV)I1%bY=hr0(eRQ diff --git a/task3/homework/output.txt b/task3/homework/output.txt deleted file mode 100644 index e69de29..0000000 diff --git a/task3/homework/shmClientPOSIX.c b/task3/homework/shmClientPOSIX.c index ac188a5..823c1fd 100644 --- a/task3/homework/shmClientPOSIX.c +++ b/task3/homework/shmClientPOSIX.c @@ -9,13 +9,28 @@ const char* name = "HESOYAM"; +#define DEFAULT_SIZE 4096 + +#define MEDIUM_SIZE + +#ifdef SMALL_SIZE #define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 65536 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + -int findFileSize(FILE* in) +size_t findFileSize(FILE* in) { assert(in); - int fileSize = 0; + size_t fileSize = 0; fseek (in, 0, SEEK_END); @@ -44,8 +59,10 @@ int main() perror("mmap"); exit(1); } - - char inBuf[SIZE]; + + #ifdef LARGE_SIZE + char inBuf[DEFAULT_SIZE]; + #endif FILE* in = fopen("input.txt", "r"); if (!in) @@ -54,19 +71,34 @@ int main() return 1; } - int file_size = findFileSize(in); + + size_t file_size = findFileSize(in); if (file_size >= SIZE) { fprintf(stderr, "DATA TOO BIG\n"); return 1; } + + #ifndef LARGE_SIZE + + fread((char*)ptr, sizeof(char), file_size, in); + + *(char*)(ptr + file_size) = '\0'; + + fclose(in); + #endif + + #ifdef LARGE_SIZE + + size_t rSize = 0; - fread(inBuf, sizeof(char), file_size, in); - inBuf[file_size] = '\0'; + while(rSize = fread((char*)(ptr + rSize), sizeof(char), DEFAULT_SIZE, in) > 0) + { + } + fclose(in); + #endif - sprintf(ptr, "%s", inBuf); - return 0; } \ No newline at end of file diff --git a/task3/homework/shmClientPOSIX.out b/task3/homework/shmClientPOSIX.out index 7094bd16ff9d10c05a8e284985d99af8a519aced..1fd2409d74b88a69eb2f4e6be4aecbf73b94cca3 100755 GIT binary patch delta 2608 zcmZ8jeQZ-z6u-A!x3=3@U)gx=MA{(&L)+4QI%HcrtiC49ZNb9OAX@~503va7!$`J4 zgw@%wa#Xg&kNJlJMs%daz!IR#BHIY+_79R_;ufbAG_fF<1{u$D-$z4wn|sbZ=lssO z=bd}r?HlZ-6NhN8g^O}T8XlPuQ@HS$F|L=TxIR4PH0X4)qyvuDK_9gk#x$~K8oDUY zH92IdsZ!yQ6SSHZ)GO+GMXmBd#d#16+ReG^7cS|mbsfGpbZGYD`hi4Y*|NGF@Q!x5 zmE}corn8{5i%|{Jnc^jXYd$a0VV44O!Xq9@0*L*T6@9$ungfF)h~DxCpr|KE4K4m@aL> z#hjCn9NRO5{FAfj9?H8?! zV?Kv0wg-X2s4syQBJ}uTL+k+0OHyz&_9nBUR>1WJwhsCd5{dzms9G777$0Fp4PYX| zfxqmdzFFL#1&*AXQJ^1;ZV?kID1|Vi-Ol(20wzNb*J}(IS;%eB{++yLvaQ z4ONaT$BL}?2d{Vo{@`8j3*O-UfDm$=M)kV2g>zVWeXQ<3j5|E1ZLztp$vqV5$m=pf zuOWKGz79_q0`_G^-EmPojyd-sk0NipC5qdSdvA;4Rpi6SSzlQ0h@u7S(0vEKv9Hj? z;xJ{;rxS43{#eJ=zeQ2KXb?(rakk)`Kz$UsIu_#MeVom>M<-MI=9vy^)?}w^+OjhA zgfRQpIET^Rz-q4AwE|@Td|}CDoC(ZnD{}JeJkw!~AC4AOP5 zW`0LCmtfi8u*!_oL%+jD8{w?OMSJ0f!=|}T!02>xP1Q1j^*$SR@H=hh33lt?P#Bp` zhqs;2(*YQF+Gso6aK1*HpuyD!?d~ir?Gn(hj9Yt^KPuT(rdpyW?ZCNt^yS=nS|gd3 zcqYNS%AE(VyNhTX_MioO5I#q4!n+N58b=bjaMS%V#Y?*=PrHCLBIj{iCRy+?!$ob@ z_`^3c?l=#p2CsiR6cjUTMX@V+-K%Ns0(UVFy~TQr++Tdys{S3Q_8DAI!s8C!5*{%d zOI*n+shD-pUt-h5b781tDJ3vd(vhsV3i$}QQl1`{=mm*R!6a&aWozpLJZKX;9gm8a zc_s{(@pKWm%Xq5;&xF%hi9Q9h3YyD!qaUqijM143`^%PE(-cwtpuoFd8XH+a|4y`; zNItQoglbp33g^pcssC`fPtl)HnyOPallP?bK9T4tiH;8w z(#)sU$V~Z38u_Z?5gM6Vb%jR0UENIS7;sfCPHi8RUx&%nHh81T#I-B`mMUKgVZ;w8 zT9tcXvdU$gRSy5J!KqGdr9F@Xz;j_A82Y_ zOCjuW8P(SdTlA9WUxWH>RS)Cda)a7XjbNxLHzYsHz+Y3IY@{aTd!vFvP delta 2957 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 delta 2528 zcmZ`)eN0nV6u+;fv_%*^Xnie1+Bz|lNlVK|MJ>=OQWE~qIUFt;U=uU9AQkZsGZ*U6 zjSexdoMh3(W$3bnY-S0AIW!w$SVXhAKo%D?+agO$>Vla%+;Gvoo%`OsMo4yF?)%;I zJLi6$bMBoxEL=Jy$hJ%(617xnK)P1P^FK*xG-_g_F@D``&eLmB9*BY`*eEa^Lz1D% zR7}PiEzsm>U_KtxX>uPN6r@aw4nR|2F^mesqQ$8hK1PV?8eIQ3Y?KWf1+%`v z(tG9e8r%3tZe;nHD?>+r{dtw?qZ~M(f7ZDO$K)#{B+|BPcl%D#($W-x-wmr* z5TYkKtQ2Vx@M}h-=j6n?FMF4n>iS_*vcuPp3@!Y)Oqxh;FvoPU1LAz22&aVHuhmIr(MXUC$uJ5Vv=CSm^zqh z=`;0aEH$-x2)U=^?S=e|*LGlIJId*f^@RMHp8F5VkKFU+`wQgT3*?&%xP$6&uSE*RPK+9P<+!L6_M!3gtokH1MyEWWxI7-`xN88QHjdVwp?rMx7 z+7GDqC7;4~Vvf)Z2{AXn1u3%cxw>#?AVizt*v3W>}ADoSF9q9_*)RcUNwud5+1Lbql4p&2DChP2G=*D60z|_Cw7Zf&30GK2G3G17#lr{dUB5bMrcHw zr*z_Vvevn4CkzuuGNL3iRF`dFV z;bs(7#pSV`?sUf?YD0F))G@&qYkLAe=Hnu^)Wm)Y*44!B2VV%r9@d3>3cf{pbM1;p z;m#RT!t-eG!>p!M*l3#Qb&A2fy+n9gzorrgq9KxcM^V}l4#w!1zC=vMB`ONcE*kV@+wIdd+bfO95 z8xeWQ!Nw7+0#5W9C99swcw4tFEm?Oe)reVwaY#;MJ$4teT^kIeXl57`EXpF>&`Ob~ zRUb<)0bC&o5ozJHbzRLOhA~FG@*9yD6KAildR}%VQkJqY4 zzriF*Hn`>W2o?~0R=tJPgV!esQCy@|znF9(O6roWdK;ci+~-023%+W5A@c>F>nUvL zFgY5*RV3NDr?}RS4S{468*D0)y!?9P+7{NA`hYp#VH->rdC<3Fv1I2j z5VxFE8`LsbEUn;=5ZC^#j)UuGzUKUIaIn}RWWdSdR=b2Lo2e5Ck0@@l1*VH7;Z+Eh zyaGeT7U64{ERo7CqqRsfwYLFHS*VdIItrdbAF61fPY5kzSTk_{PH>eY*2sZk_ zRaREl)`ZqI_}o5s348fqWK{)ZmesyJt7ZEjzcg| zlm#mTIU)~BjyBjD@TBmd95z62pj70s$Z-m;1w10pD~>YQ%R5XFwqXdCOYl{>XqMTX zBEw|4-`2+@j*U;6`zu6|pC?BvY_0H^xhHK9uc*fOzJ?r+3=4>resjH38>t>Pp~N5a zD8y0XG1>)_DDilcK@9pI-x)G Date: Tue, 18 Oct 2022 14:02:04 +0300 Subject: [PATCH 13/40] Add files via upload --- task3/FIFO/FIFOReceiver.c | 46 ++++++++ task3/FIFO/FIFOSender.c | 50 +++++++++ task3/FIFO/fifo | 0 task3/FIFO/output.txt | Bin 0 -> 4096 bytes task3/homework/mqSYSV/mqSYSVReceiver.c | 59 +++++++++++ task3/homework/mqSYSV/mqSYSVSender.c | 91 ++++++++++++++++ task3/homework/shmPOSIX/shmClientPOSIX.c | 93 ++++++++++++++++ task3/homework/shmPOSIX/shmServerPOSIX.c | 49 +++++++++ task3/homework/start.py | 128 +++++++++++++++++++++++ 9 files changed, 516 insertions(+) create mode 100644 task3/FIFO/FIFOReceiver.c create mode 100644 task3/FIFO/FIFOSender.c create mode 100644 task3/FIFO/fifo create mode 100644 task3/FIFO/output.txt create mode 100644 task3/homework/mqSYSV/mqSYSVReceiver.c create mode 100644 task3/homework/mqSYSV/mqSYSVSender.c create mode 100644 task3/homework/shmPOSIX/shmClientPOSIX.c create mode 100644 task3/homework/shmPOSIX/shmServerPOSIX.c create mode 100644 task3/homework/start.py diff --git a/task3/FIFO/FIFOReceiver.c b/task3/FIFO/FIFOReceiver.c new file mode 100644 index 0000000..8ab1878 --- /dev/null +++ b/task3/FIFO/FIFOReceiver.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include + +#define FIFO "fifo" + +#define DEFAULT_SIZE 512 + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + + +int main() +{ + mknod(FIFO, S_IFIFO | 0666, 0); + printf("Waiting for a writer\n"); + int fd = open(FIFO, O_RDONLY); + printf("A writer is connected\n"); + + int size = 0; + + char buf[DEFAULT_SIZE]; + + FILE* out = fopen("./FIFO/output.txt", "w"); + + while ((size = read(fd, buf, sizeof(buf))) > 0) + { + fwrite(buf, sizeof(char), size, out); + } + + close(fd); + fclose(out); + return 0; +} \ No newline at end of file diff --git a/task3/FIFO/FIFOSender.c b/task3/FIFO/FIFOSender.c new file mode 100644 index 0000000..6b72647 --- /dev/null +++ b/task3/FIFO/FIFOSender.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_SIZE 512 +#define FIFO "fifo" + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + + +int main() +{ + mknod(FIFO, S_IFIFO | 0666, 0); + printf("Waiting for a reader\n"); + int fd_FIFO = open(FIFO, O_WRONLY); + int fd_in = open("./input.txt", O_RDONLY); + if (fd_in < 0) + { + fprintf(stderr, "FILE NOT FOUND\n"); + } + printf("A reader is connected\n"); + + int size = 0; + + char buf[DEFAULT_SIZE]; + + while ((size = read(fd_in, buf, sizeof(buf))) > 0) + { + write(fd_FIFO, buf, size); + } + + close(fd_FIFO); + close(fd_in); + + return 0; +} \ No newline at end of file diff --git a/task3/FIFO/fifo b/task3/FIFO/fifo new file mode 100644 index 0000000..e69de29 diff --git a/task3/FIFO/output.txt b/task3/FIFO/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..5583a26d7f5b0ee1e62b5d3821307c93731bbc1a GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/task3/homework/mqSYSV/mqSYSVReceiver.c b/task3/homework/mqSYSV/mqSYSVReceiver.c new file mode 100644 index 0000000..d343168 --- /dev/null +++ b/task3/homework/mqSYSV/mqSYSVReceiver.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_KEY 1337 +#define MAX_MSG_SIZE 4096 +#define DEFAULT_TYPE 1488 + + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + +typedef struct msgbuf +{ + long mtype; + char mtext[MAX_MSG_SIZE]; +} message_buf; + + +int main() +{ + int msqid = -1; + key_t key = DEFAULT_KEY; + message_buf rbuf; + rbuf.mtype = DEFAULT_TYPE; + + if ((msqid = msgget(key, 0666)) < 0) + { + perror("msgget"); + exit(1); + } + + + for (size_t bytes = SIZE; bytes > 0;) + { + if (msgrcv(msqid, &rbuf, MAX_MSG_SIZE, DEFAULT_TYPE, 0) < 0) + { + perror("msg:"); + exit(1); + } + + bytes-=MAX_MSG_SIZE; + } + + return 0; +} \ No newline at end of file diff --git a/task3/homework/mqSYSV/mqSYSVSender.c b/task3/homework/mqSYSV/mqSYSVSender.c new file mode 100644 index 0000000..a1a8de9 --- /dev/null +++ b/task3/homework/mqSYSV/mqSYSVSender.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_KEY 1337 +#define DEFAULT_TYPE 1488 +#define MAX_MSG_SIZE 4096 + + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + +typedef struct msgbuf +{ + long mtype; + char mtext[MAX_MSG_SIZE]; +} message_buf; + + +int findFileSize(FILE* in) +{ + assert(in); + + int fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + + +int main() +{ + int msqid = -1; + int msgflg = IPC_CREAT | 0666; + key_t key = DEFAULT_KEY; + message_buf sbuf; + sbuf.mtype = DEFAULT_TYPE; + + + if ((msqid = msgget(key, msgflg)) < 0) + { + perror("msgget"); + exit(1); + } + else + printf("msgget: msgget succeeded: msqid = %d\n", msqid); + + + FILE* in = fopen("./input.txt", "r"); + if (!in) + { + fprintf(stderr,"FILE NOT FOUND\n"); + return 1; + } + + + for (size_t bytes = SIZE; bytes > 0;) + { + fread(sbuf.mtext, sizeof(char), MAX_MSG_SIZE, in); + sleep(0,01); + if (msgsnd(msqid, &sbuf, MAX_MSG_SIZE, IPC_NOWAIT) < 0) + { + perror("msg:"); + exit(1); + } + bytes-=MAX_MSG_SIZE; + } + + fclose(in); + + return 0; +} diff --git a/task3/homework/shmPOSIX/shmClientPOSIX.c b/task3/homework/shmPOSIX/shmClientPOSIX.c new file mode 100644 index 0000000..e183502 --- /dev/null +++ b/task3/homework/shmPOSIX/shmClientPOSIX.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +const char* name = "HESOYAM"; + +#define DEFAULT_SIZE 512 + + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483649 +#endif + + +size_t findFileSize(FILE* in) +{ + assert(in); + + size_t fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + + +int main() +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); + + ftruncate(shm_fd, SIZE); + + ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + char inBuf[DEFAULT_SIZE]; + + FILE* in = fopen("./input.txt", "r"); + if (!in) + { + fprintf(stderr, "File not found\n"); + return 1; + } + + + size_t file_size = findFileSize(in); + + if (file_size >= SIZE) + { + fprintf(stderr, "DATA TOO BIG\n"); + return 1; + } + + size_t rSize = 0; + size_t counter = 0; + while(rSize = fread((char*)(ptr + rSize), sizeof(char), DEFAULT_SIZE, in) > 0) + { + counter++; + } + + + fprintf(stdout, "Packets of %d bytes = %lu\n", DEFAULT_SIZE, counter); + + fclose(in); + + return 0; +} \ No newline at end of file diff --git a/task3/homework/shmPOSIX/shmServerPOSIX.c b/task3/homework/shmPOSIX/shmServerPOSIX.c new file mode 100644 index 0000000..f9ae6c5 --- /dev/null +++ b/task3/homework/shmPOSIX/shmServerPOSIX.c @@ -0,0 +1,49 @@ +// C program for Consumer process illustrating +// POSIX shared-memory API. +// monitor it using ipcs +// lsof -p 16894 +// fuser some-huge-file.txt +#include +#include +#include +#include +#include +#include + +const char* name = "HESOYAM"; + +#define DEFAULT_SIZE 512 + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483649 +#endif + + +int main() +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_RDONLY, 0666); + + ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + + shm_unlink(name); + return 0; +} \ No newline at end of file diff --git a/task3/homework/start.py b/task3/homework/start.py new file mode 100644 index 0000000..b9e40b4 --- /dev/null +++ b/task3/homework/start.py @@ -0,0 +1,128 @@ +import os +import sys +import time + + +## hate makefiles.... +class ANSI(): + def background(code): + return "\33[{code}m".format(code=code) + + def style_text(code): + return "\33[{code}m".format(code=code) + + def color_text(code): + return "\33[{code}m".format(code=code) + + +argc = len(sys.argv) + +if (argc > 1): + if (sys.argv[1] == "-h"): + print("Write 'start.py -small' for testing with SMALL_SIZE") + print("Write 'start.py -medium' for testing with MEDIUM_SIZE") + print("Write 'start.py -large' for testing with LARGE_SIZE") + exit() + + + if (sys.argv[1] == '-small'): + cmd = "gcc -DSMALL_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" + os.system(cmd) + print("") + cmd = "dd if=/dev/urandom of=input.txt bs=4096 count=1" + os.system(cmd) + print("") + + cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) + print(outputFormat + "\nFIFO TIME:", passedTime) + print("") + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("MQSYSV TIME:", passedTime) + + + if (sys.argv[1] == '-medium'): + cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" + os.system(cmd) + cmd = "dd if=/dev/urandom of=input.txt bs=25600 count=4096" + os.system(cmd) + print("") + + cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) + print(outputFormat + "FIFO TIME:", passedTime) + print("") + + if (sys.argv[1] == '-large'): + cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" + os.system(cmd) + cmd = "dd if=/dev/urandom of=input.txt bs=1048576 count=2048" + os.system(cmd) + print("") + + cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" + + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) + print(outputFormat + "FIFO TIME:", passedTime) + print("") + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("MQSYSV TIME:", passedTime) + +else: + print("Write 'start.py -h' for information.") + From ccbb77162819740d8d715daf9d25506e311a6680 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 18 Oct 2022 14:02:51 +0300 Subject: [PATCH 14/40] Delete task3 directory --- task3/FIFO/FIFOReceiver.c | 46 -------- task3/FIFO/FIFOSender.c | 50 --------- task3/FIFO/fifo | 0 task3/FIFO/output.txt | Bin 4096 -> 0 bytes task3/examples/5_perror_fmt.c | 19 ---- task3/examples/disclaimer.txt | 1 - task3/examples/posix_mq_client.c | 36 ------- task3/examples/posix_mq_server.c | 36 ------- task3/examples/receiver_mq_sysv.c | 36 ------- task3/examples/sender_mq_sysv.c | 52 --------- task3/examples/shm_client_posix.c | 42 -------- task3/examples/shm_server_posix.c | 38 ------- task3/homework/.vscode/settings.json | 7 -- task3/homework/FIFO_receiver.c | 47 --------- task3/homework/FIFO_receiver.out | Bin 17080 -> 0 bytes task3/homework/FIFO_sender.c | 51 --------- task3/homework/FIFO_sender.out | Bin 17024 -> 0 bytes task3/homework/mqSYSV/mqSYSVReceiver.c | 59 ----------- task3/homework/mqSYSV/mqSYSVSender.c | 91 ---------------- task3/homework/mqSYSV_receiver.c | 51 --------- task3/homework/mqSYSV_receiver.out | Bin 17144 -> 0 bytes task3/homework/mqSYSV_sender.c | 105 ------------------- task3/homework/mqSYSV_sender.out | Bin 17408 -> 0 bytes task3/homework/shmClientPOSIX.c | 104 ------------------ task3/homework/shmClientPOSIX.out | Bin 17360 -> 0 bytes task3/homework/shmPOSIX/shmClientPOSIX.c | 93 ---------------- task3/homework/shmPOSIX/shmServerPOSIX.c | 49 --------- task3/homework/shmServerPOSIX.c | 58 ---------- task3/homework/shmServerPOSIX.out | Bin 17144 -> 0 bytes task3/homework/start.py | 128 ----------------------- task3/shm_overview.txt | 4 - task3/sysv_msgq_disclaimer.txt | 33 ------ task3/task.txt | 10 -- task3/test.c | 18 ---- task3/test1.c | 15 --- 35 files changed, 1279 deletions(-) delete mode 100644 task3/FIFO/FIFOReceiver.c delete mode 100644 task3/FIFO/FIFOSender.c delete mode 100644 task3/FIFO/fifo delete mode 100644 task3/FIFO/output.txt delete mode 100644 task3/examples/5_perror_fmt.c delete mode 100644 task3/examples/disclaimer.txt delete mode 100644 task3/examples/posix_mq_client.c delete mode 100644 task3/examples/posix_mq_server.c delete mode 100644 task3/examples/receiver_mq_sysv.c delete mode 100644 task3/examples/sender_mq_sysv.c delete mode 100644 task3/examples/shm_client_posix.c delete mode 100644 task3/examples/shm_server_posix.c delete mode 100644 task3/homework/.vscode/settings.json delete mode 100644 task3/homework/FIFO_receiver.c delete mode 100755 task3/homework/FIFO_receiver.out delete mode 100644 task3/homework/FIFO_sender.c delete mode 100755 task3/homework/FIFO_sender.out delete mode 100644 task3/homework/mqSYSV/mqSYSVReceiver.c delete mode 100644 task3/homework/mqSYSV/mqSYSVSender.c delete mode 100644 task3/homework/mqSYSV_receiver.c delete mode 100755 task3/homework/mqSYSV_receiver.out delete mode 100644 task3/homework/mqSYSV_sender.c delete mode 100755 task3/homework/mqSYSV_sender.out delete mode 100644 task3/homework/shmClientPOSIX.c delete mode 100755 task3/homework/shmClientPOSIX.out delete mode 100644 task3/homework/shmPOSIX/shmClientPOSIX.c delete mode 100644 task3/homework/shmPOSIX/shmServerPOSIX.c delete mode 100644 task3/homework/shmServerPOSIX.c delete mode 100755 task3/homework/shmServerPOSIX.out delete mode 100644 task3/homework/start.py delete mode 100644 task3/shm_overview.txt delete mode 100644 task3/sysv_msgq_disclaimer.txt delete mode 100644 task3/task.txt delete mode 100644 task3/test.c delete mode 100644 task3/test1.c diff --git a/task3/FIFO/FIFOReceiver.c b/task3/FIFO/FIFOReceiver.c deleted file mode 100644 index 8ab1878..0000000 --- a/task3/FIFO/FIFOReceiver.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define FIFO "fifo" - -#define DEFAULT_SIZE 512 - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 104857600 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - - -int main() -{ - mknod(FIFO, S_IFIFO | 0666, 0); - printf("Waiting for a writer\n"); - int fd = open(FIFO, O_RDONLY); - printf("A writer is connected\n"); - - int size = 0; - - char buf[DEFAULT_SIZE]; - - FILE* out = fopen("./FIFO/output.txt", "w"); - - while ((size = read(fd, buf, sizeof(buf))) > 0) - { - fwrite(buf, sizeof(char), size, out); - } - - close(fd); - fclose(out); - return 0; -} \ No newline at end of file diff --git a/task3/FIFO/FIFOSender.c b/task3/FIFO/FIFOSender.c deleted file mode 100644 index 6b72647..0000000 --- a/task3/FIFO/FIFOSender.c +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include -#include -#include -#include - - -#define DEFAULT_SIZE 512 -#define FIFO "fifo" - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 104857600 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - - -int main() -{ - mknod(FIFO, S_IFIFO | 0666, 0); - printf("Waiting for a reader\n"); - int fd_FIFO = open(FIFO, O_WRONLY); - int fd_in = open("./input.txt", O_RDONLY); - if (fd_in < 0) - { - fprintf(stderr, "FILE NOT FOUND\n"); - } - printf("A reader is connected\n"); - - int size = 0; - - char buf[DEFAULT_SIZE]; - - while ((size = read(fd_in, buf, sizeof(buf))) > 0) - { - write(fd_FIFO, buf, size); - } - - close(fd_FIFO); - close(fd_in); - - return 0; -} \ No newline at end of file diff --git a/task3/FIFO/fifo b/task3/FIFO/fifo deleted file mode 100644 index e69de29..0000000 diff --git a/task3/FIFO/output.txt b/task3/FIFO/output.txt deleted file mode 100644 index 5583a26d7f5b0ee1e62b5d3821307c93731bbc1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 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 diff --git a/task3/examples/5_perror_fmt.c b/task3/examples/5_perror_fmt.c deleted file mode 100644 index 61d9e5c..0000000 --- a/task3/examples/5_perror_fmt.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -extern int errno; - -int main () -{ - FILE *ptrFile; - ptrFile = fopen ("fodsfksgjskgjwgjwglwrg.txt","rb"); - if (ptrFile == NULL) - { - perror("Case with prefix"); - printf( "Case with fmt string : %s\n", strerror(errno) ); - } - else - fclose (ptrFile); - return 0; -} diff --git a/task3/examples/disclaimer.txt b/task3/examples/disclaimer.txt deleted file mode 100644 index 8896479..0000000 --- a/task3/examples/disclaimer.txt +++ /dev/null @@ -1 +0,0 @@ -Здесь расположены некоторые характерные примеры по SYS V и POSIX IPC. Отдельные примеры не были скопированы с преподавательского компа после семинара, поэтому директория будет дополняться. diff --git a/task3/examples/posix_mq_client.c b/task3/examples/posix_mq_client.c deleted file mode 100644 index f089999..0000000 --- a/task3/examples/posix_mq_client.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#define SZ 4096 - -#define QNAME "/example" - -int main() { - mqd_t queue; - struct mq_attr attr; - unsigned prio = 1; - attr.mq_flags = 0; - attr.mq_msgsize = SZ; - attr.mq_curmsgs = 0; - - if ((queue = mq_open(QNAME, O_WRONLY, 0666, &attr)) == -1) { - perror("Client: mq open error"); - return 1; - } - - char buf[4096]; - strcpy(buf, "hello world"); - - if (mq_send(queue, buf, strlen(buf)+1, prio) == -1) { - perror("Client: mq send error"); - return 1; - } - - return 0; -} diff --git a/task3/examples/posix_mq_server.c b/task3/examples/posix_mq_server.c deleted file mode 100644 index bbdbafc..0000000 --- a/task3/examples/posix_mq_server.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define QNAME "/example" - -#define SZ 4096 - -int main() { - mqd_t server; - unsigned prio = 1; - - struct mq_attr attr; - - attr.mq_flags = 0; - attr.mq_msgsize = SZ; - attr.mq_curmsgs = 0; - - if ((server = mq_open(QNAME, O_RDONLY | O_CREAT, 0666, &attr)) == -1) { - perror("Server: mq open failed"); - return 1; - } - char buf[SZ]; - - - if (mq_receive(server, buf, SZ, NULL) == -1) { - perror ("Server: mq receive error"); - return 1; - } - printf("%s", buf); - - return 0; -} diff --git a/task3/examples/receiver_mq_sysv.c b/task3/examples/receiver_mq_sysv.c deleted file mode 100644 index eb8045e..0000000 --- a/task3/examples/receiver_mq_sysv.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include - -#define MSG_SIZE 1024 // < /proc/sys/fs/mqueue/msg_max - - -typedef struct msgbuf { - long mtype; - char mtext[MSG_SIZE]; -} message_buf; - - -int main() -{ - int msqid; - key_t key; - message_buf rbuf; - - key = 10; - - if ((msqid = msgget(key, 0666)) < 0) { - perror("msgget"); - exit(1); - } - - - if (msgrcv(msqid, &rbuf, MSG_SIZE, 1, 0) < 0) { - perror("msgrcv"); - exit(1); - } - - printf("%s\n", rbuf.mtext); - return 0; -} diff --git a/task3/examples/sender_mq_sysv.c b/task3/examples/sender_mq_sysv.c deleted file mode 100644 index 1e6ad42..0000000 --- a/task3/examples/sender_mq_sysv.c +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include -#include - -#define MSG_SIZE 1024 -// нужна структурка данных, в которой хранится тип сообщения и буфер -typedef struct msgbuf { - long mtype; - char mtext[MSG_SIZE]; - } message_buf; - -main() -{ - int msqid; - int msgflg = IPC_CREAT | 0666; - key_t key; - message_buf sbuf; - size_t buf_length; - - key = 1024; //rewrite with ftok - - if ((msqid = msgget(key, msgflg )) < 0) { - perror("msgget"); - exit(1); - } - else - printf("msgget: msgget succeeded: msqid = %d\n", msqid); - - - sbuf.mtype = 1; - - printf("msgget: msgget succeeded: msqid = %d\n", msqid); - - (void) strcpy(sbuf.mtext, "HELLO"); - - printf("msgget: msgget succeeded: msqid = %d\n", msqid); - - buf_length = strlen(sbuf.mtext) + 1 ; // данные сообщения по прежнему считаем '\0'-terminated - строкой. - - if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) { - printf ("%d, %d, %s, %d\n", msqid, sbuf.mtype, sbuf.mtext, buf_length); - perror("msgsnd"); - exit(1); - } - - else - printf("Message: \"%s\" Sent\n", sbuf.mtext); - - return 0; -} diff --git a/task3/examples/shm_client_posix.c b/task3/examples/shm_client_posix.c deleted file mode 100644 index 078057c..0000000 --- a/task3/examples/shm_client_posix.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include -#include -#include -#include -#include - -int main() -{ - /* the size (in bytes) of shared memory object */ - const int SIZE = 4096; - - /* name of the shared memory object */ - const char* name = "OS"; - - /* strings written to shared memory */ - const char* message_0 = "Hello"; - const char* message_1 = "World!"; - - /* shared memory file descriptor */ - int shm_fd; - - /* pointer to shared memory object */ - void* ptr; - - /* create the shared memory object */ - shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); - - /* configure the size of the shared memory object */ - ftruncate(shm_fd, SIZE); - - /* memory map the shared memory object */ - ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); - - /* write to the shared memory object */ - sprintf(ptr, "%s", message_0); - - ptr += strlen(message_0); - sprintf(ptr, "%s", message1); - ptr += strlen(message_1); - return 0; -} \ No newline at end of file diff --git a/task3/examples/shm_server_posix.c b/task3/examples/shm_server_posix.c deleted file mode 100644 index ddebc94..0000000 --- a/task3/examples/shm_server_posix.c +++ /dev/null @@ -1,38 +0,0 @@ -// C program for Consumer process illustrating -// POSIX shared-memory API. -// monitor it using ipcs -// lsof -p 16894 -// fuser some-huge-file.txt -#include -#include -#include -#include -#include - -int main() -{ - /* the size (in bytes) of shared memory object */ - const int SIZE = 4096; - - /* name of the shared memory object */ - const char* name = "OS"; - - /* shared memory file descriptor */ - int shm_fd; - - /* pointer to shared memory object */ - void* ptr; - - /* open the shared memory object */ - shm_fd = shm_open(name, O_RDONLY, 0666); - - /* memory map the shared memory object */ - ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); - - /* read from the shared memory object */ - printf("%s", (char*)ptr); - - /* remove the shared memory object */ - shm_unlink(name); - return 0; -} \ No newline at end of file diff --git a/task3/homework/.vscode/settings.json b/task3/homework/.vscode/settings.json deleted file mode 100644 index eecf15b..0000000 --- a/task3/homework/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files.associations": { - "stat.h": "c", - "stdlib.h": "c", - "unistd.h": "c" - } -} \ No newline at end of file diff --git a/task3/homework/FIFO_receiver.c b/task3/homework/FIFO_receiver.c deleted file mode 100644 index 269c1ec..0000000 --- a/task3/homework/FIFO_receiver.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define FIFO "fifo" - -#define DEFAULT_SIZE = 4096 - -#define MEDIUM_SIZE - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 65536 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - - -int main() -{ - mknod(FIFO, S_IFIFO | 0666, 0); - printf("Waiting for a writer\n"); - int fd = open(FIFO, O_RDONLY); - printf("A writer is connected\n"); - - int size = 0; - char buf[SIZE]; - - FILE* out = fopen("output.txt", "w"); - - while (( size = read(fd, buf, sizeof(buf))) > 0) - { - fwrite(buf, sizeof(char), size, out); - } - - close(fd); - fclose(out); - return 0; -} \ No newline at end of file diff --git a/task3/homework/FIFO_receiver.out b/task3/homework/FIFO_receiver.out deleted file mode 100755 index df9dd14b7b7aff2c00903b93767e32995b7097a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17080 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 S?NQqPkDD!xl`aF9DE -#include -#include -#include -#include -#include - - -#define DEFAULT_SIZE 4096 -#define FIFO "fifo" - -#define MEDIUM_SIZE - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 65536 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - - -int main() -{ - mknod(FIFO, S_IFIFO | 0666, 0); - printf("Waiting for a reader\n"); - int fd_FIFO = open(FIFO, O_WRONLY); - int fd_in = open("input.txt", O_RDONLY); - printf("A reader is connected\n"); - - int size = 0; - char buf[SIZE]; - - #ifndef LARGE_SIZE - - while (( size = read(fd_in, buf, sizeof(buf))) > 0) - { - write(fd_FIFO, buf, size); - } - - close(fd_FIFO); - close(fd_in); - - #endif - - return 0; -} \ No newline at end of file diff --git a/task3/homework/FIFO_sender.out b/task3/homework/FIFO_sender.out deleted file mode 100755 index 1a5613495e0c109667f02403c30a7604aba4486d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17024 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 -#include -#include -#include -#include -#include - - -#define DEFAULT_KEY 1337 -#define MAX_MSG_SIZE 4096 -#define DEFAULT_TYPE 1488 - - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 104857600 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - -typedef struct msgbuf -{ - long mtype; - char mtext[MAX_MSG_SIZE]; -} message_buf; - - -int main() -{ - int msqid = -1; - key_t key = DEFAULT_KEY; - message_buf rbuf; - rbuf.mtype = DEFAULT_TYPE; - - if ((msqid = msgget(key, 0666)) < 0) - { - perror("msgget"); - exit(1); - } - - - for (size_t bytes = SIZE; bytes > 0;) - { - if (msgrcv(msqid, &rbuf, MAX_MSG_SIZE, DEFAULT_TYPE, 0) < 0) - { - perror("msg:"); - exit(1); - } - - bytes-=MAX_MSG_SIZE; - } - - return 0; -} \ No newline at end of file diff --git a/task3/homework/mqSYSV/mqSYSVSender.c b/task3/homework/mqSYSV/mqSYSVSender.c deleted file mode 100644 index a1a8de9..0000000 --- a/task3/homework/mqSYSV/mqSYSVSender.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -#define DEFAULT_KEY 1337 -#define DEFAULT_TYPE 1488 -#define MAX_MSG_SIZE 4096 - - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 104857600 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - -typedef struct msgbuf -{ - long mtype; - char mtext[MAX_MSG_SIZE]; -} message_buf; - - -int findFileSize(FILE* in) -{ - assert(in); - - int fileSize = 0; - - fseek (in, 0, SEEK_END); - - fileSize = ftell (in); - - fseek (in, 0, SEEK_SET); - - return (fileSize); -} - - -int main() -{ - int msqid = -1; - int msgflg = IPC_CREAT | 0666; - key_t key = DEFAULT_KEY; - message_buf sbuf; - sbuf.mtype = DEFAULT_TYPE; - - - if ((msqid = msgget(key, msgflg)) < 0) - { - perror("msgget"); - exit(1); - } - else - printf("msgget: msgget succeeded: msqid = %d\n", msqid); - - - FILE* in = fopen("./input.txt", "r"); - if (!in) - { - fprintf(stderr,"FILE NOT FOUND\n"); - return 1; - } - - - for (size_t bytes = SIZE; bytes > 0;) - { - fread(sbuf.mtext, sizeof(char), MAX_MSG_SIZE, in); - sleep(0,01); - if (msgsnd(msqid, &sbuf, MAX_MSG_SIZE, IPC_NOWAIT) < 0) - { - perror("msg:"); - exit(1); - } - bytes-=MAX_MSG_SIZE; - } - - fclose(in); - - return 0; -} diff --git a/task3/homework/mqSYSV_receiver.c b/task3/homework/mqSYSV_receiver.c deleted file mode 100644 index bf0bd8e..0000000 --- a/task3/homework/mqSYSV_receiver.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include -#include -#include -#include -#include - - -#define DEFAULT_KEY 1337 -#define MAX_MSG_SIZE 4096 -#define DEFAULT_TYPE 1488 - -typedef struct msgbuf { - long mtype; - char mtext[MAX_MSG_SIZE]; -} message_buf; - - -void dump_data(char* buf, int size) -{ - FILE* out = fopen("output.txt", "wb"); - if (!out) - { - fprintf(stderr,"File can't be created\n"); - return; - } - - fwrite(buf, sizeof(char), size, out); - fclose(out); -} - - -int main() -{ - int msqid = -1; - key_t key = DEFAULT_KEY; - message_buf rbuf; - - if ((msqid = msgget(key, 0666)) < 0) { - perror("msgget"); - exit(1); - } - - if (msgrcv(msqid, &rbuf, MAX_MSG_SIZE, DEFAULT_TYPE, 0) < 0) { - perror("msgrcv"); - exit(1); - } - - printf("MSG: \'%s\'\n", rbuf.mtext); - -} \ No newline at end of file diff --git a/task3/homework/mqSYSV_receiver.out b/task3/homework/mqSYSV_receiver.out deleted file mode 100755 index ba4ab31b3faf431ae1e6da8b65c7421018f1536d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17144 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 Pzi^|avCw1SVa2}y!5iJs diff --git a/task3/homework/mqSYSV_sender.c b/task3/homework/mqSYSV_sender.c deleted file mode 100644 index 280db37..0000000 --- a/task3/homework/mqSYSV_sender.c +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -#define DEFAULT_KEY 1337 -#define DEFAULT_TYPE 1488 -#define MAX_MSG_SIZE 4096 - -enum errors -{ - OVERFLOW_MSG_ERR = -2, - FILE_ERR = -1, - OK = 0 -}; - -typedef struct msgbuf { - long mtype; - char mtext[MAX_MSG_SIZE]; - } message_buf; - - -int findFileSize(FILE* in) -{ - assert(in); - - int fileSize = 0; - - fseek (in, 0, SEEK_END); - - fileSize = ftell (in); - - fseek (in, 0, SEEK_SET); - - return (fileSize); -} - -int initMsgBuf(struct msgbuf* sbuf, size_t* buf_length) -{ - sbuf->mtype = DEFAULT_TYPE; - - FILE* in = NULL; - if (in = fopen("input.txt", "rb")) - { - *buf_length = findFileSize(in); - - if (*buf_length >= MAX_MSG_SIZE) return OVERFLOW_MSG_ERR; - - fread(sbuf->mtext, sizeof(char), *buf_length, in); - sbuf->mtext[*buf_length] = '\0'; - - fclose(in); - - return OK; - } - else - { - fprintf(stderr, "File not found\n"); - return FILE_ERR; - } -} - - -int main() -{ - int msqid = -1; - int msgflg = IPC_CREAT | 0666; - key_t key = DEFAULT_KEY; - message_buf sbuf; - size_t buf_length = 0; - - if ((msqid = msgget(key, msgflg)) < 0) { - perror("msgget"); - exit(1); - } - else - printf("msgget: msgget succeeded: msqid = %d\n", msqid); - - - int err = initMsgBuf(&sbuf, &buf_length); - - if (err == OVERFLOW_MSG_ERR) - { - fprintf(stderr, "MESSAGE TOO BIG\n"); - return OVERFLOW_MSG_ERR; - } - if (err == FILE_ERR) - { - return FILE_ERR; - } - - if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) { - printf ("%d, %ld, %s, %ld\n", msqid, sbuf.mtype, sbuf.mtext, buf_length); - perror("msgsnd"); - exit(1); - } - - printf("MSG %s \n", sbuf.mtext); - - return 0; -} diff --git a/task3/homework/mqSYSV_sender.out b/task3/homework/mqSYSV_sender.out deleted file mode 100755 index 5538d9969ed4db36dfe1d606f1886a46d1f5a36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 iyKQOzUZNKZNbmLtxm;UH&;HfzZ@ -#include -#include -#include -#include -#include -#include -#include - -const char* name = "HESOYAM"; - -#define DEFAULT_SIZE 4096 - -#define MEDIUM_SIZE - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 65536 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - - -size_t findFileSize(FILE* in) -{ - assert(in); - - size_t fileSize = 0; - - fseek (in, 0, SEEK_END); - - fileSize = ftell (in); - - fseek (in, 0, SEEK_SET); - - return (fileSize); -} - - -int main() -{ - int shm_fd = -1; - - void* ptr = NULL; - - shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); - - ftruncate(shm_fd, SIZE); - - ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); - - if(ptr == MAP_FAILED) - { - perror("mmap"); - exit(1); - } - - #ifdef LARGE_SIZE - char inBuf[DEFAULT_SIZE]; - #endif - - FILE* in = fopen("input.txt", "r"); - if (!in) - { - fprintf(stderr, "File not found\n"); - return 1; - } - - - size_t file_size = findFileSize(in); - - if (file_size >= SIZE) - { - fprintf(stderr, "DATA TOO BIG\n"); - return 1; - } - - #ifndef LARGE_SIZE - - fread((char*)ptr, sizeof(char), file_size, in); - - *(char*)(ptr + file_size) = '\0'; - - fclose(in); - #endif - - #ifdef LARGE_SIZE - - size_t rSize = 0; - - while(rSize = fread((char*)(ptr + rSize), sizeof(char), DEFAULT_SIZE, in) > 0) - { - } - - fclose(in); - #endif - - return 0; -} \ No newline at end of file diff --git a/task3/homework/shmClientPOSIX.out b/task3/homework/shmClientPOSIX.out deleted file mode 100755 index 1fd2409d74b88a69eb2f4e6be4aecbf73b94cca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17360 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 MCp8xN41BEk2NscAV*mgE diff --git a/task3/homework/shmPOSIX/shmClientPOSIX.c b/task3/homework/shmPOSIX/shmClientPOSIX.c deleted file mode 100644 index e183502..0000000 --- a/task3/homework/shmPOSIX/shmClientPOSIX.c +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -const char* name = "HESOYAM"; - -#define DEFAULT_SIZE 512 - - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 104857600 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483649 -#endif - - -size_t findFileSize(FILE* in) -{ - assert(in); - - size_t fileSize = 0; - - fseek (in, 0, SEEK_END); - - fileSize = ftell (in); - - fseek (in, 0, SEEK_SET); - - return (fileSize); -} - - -int main() -{ - int shm_fd = -1; - - void* ptr = NULL; - - shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); - - ftruncate(shm_fd, SIZE); - - ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); - - if(ptr == MAP_FAILED) - { - perror("mmap"); - exit(1); - } - - char inBuf[DEFAULT_SIZE]; - - FILE* in = fopen("./input.txt", "r"); - if (!in) - { - fprintf(stderr, "File not found\n"); - return 1; - } - - - size_t file_size = findFileSize(in); - - if (file_size >= SIZE) - { - fprintf(stderr, "DATA TOO BIG\n"); - return 1; - } - - size_t rSize = 0; - size_t counter = 0; - while(rSize = fread((char*)(ptr + rSize), sizeof(char), DEFAULT_SIZE, in) > 0) - { - counter++; - } - - - fprintf(stdout, "Packets of %d bytes = %lu\n", DEFAULT_SIZE, counter); - - fclose(in); - - return 0; -} \ No newline at end of file diff --git a/task3/homework/shmPOSIX/shmServerPOSIX.c b/task3/homework/shmPOSIX/shmServerPOSIX.c deleted file mode 100644 index f9ae6c5..0000000 --- a/task3/homework/shmPOSIX/shmServerPOSIX.c +++ /dev/null @@ -1,49 +0,0 @@ -// C program for Consumer process illustrating -// POSIX shared-memory API. -// monitor it using ipcs -// lsof -p 16894 -// fuser some-huge-file.txt -#include -#include -#include -#include -#include -#include - -const char* name = "HESOYAM"; - -#define DEFAULT_SIZE 512 - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 104857600 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483649 -#endif - - -int main() -{ - int shm_fd = -1; - - void* ptr = NULL; - - shm_fd = shm_open(name, O_RDONLY, 0666); - - ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); - - if(ptr == MAP_FAILED) - { - perror("mmap"); - exit(1); - } - - - shm_unlink(name); - return 0; -} \ No newline at end of file diff --git a/task3/homework/shmServerPOSIX.c b/task3/homework/shmServerPOSIX.c deleted file mode 100644 index 90c588d..0000000 --- a/task3/homework/shmServerPOSIX.c +++ /dev/null @@ -1,58 +0,0 @@ -// C program for Consumer process illustrating -// POSIX shared-memory API. -// monitor it using ipcs -// lsof -p 16894 -// fuser some-huge-file.txt -#include -#include -#include -#include -#include -#include - -const char* name = "HESOYAM"; - -#define DEFAULT_SIZE 4096 - -#define MEDIUM_SIZE - -#ifdef SMALL_SIZE -#define SIZE 4096 -#endif - -#ifdef MEDIUM_SIZE -#define SIZE 65536 -#endif - -#ifdef LARGE_SIZE -#define SIZE 2147483648 -#endif - - -int main() -{ - int shm_fd = -1; - - void* ptr = NULL; - - shm_fd = shm_open(name, O_RDONLY, 0666); - - ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); - - if(ptr == MAP_FAILED) - { - perror("mmap"); - exit(1); - } - - FILE* out = fopen("output.txt", "w"); - - int i = 0; - - - - fclose(out); - - shm_unlink(name); - return 0; -} \ No newline at end of file diff --git a/task3/homework/shmServerPOSIX.out b/task3/homework/shmServerPOSIX.out deleted file mode 100755 index dd8edc4775d837f965298db5fa4d521320b325b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17144 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 1): - if (sys.argv[1] == "-h"): - print("Write 'start.py -small' for testing with SMALL_SIZE") - print("Write 'start.py -medium' for testing with MEDIUM_SIZE") - print("Write 'start.py -large' for testing with LARGE_SIZE") - exit() - - - if (sys.argv[1] == '-small'): - cmd = "gcc -DSMALL_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" - os.system(cmd) - cmd = "gcc -DSMALL_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" - os.system(cmd) - cmd = "gcc -DSMALL_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" - os.system(cmd) - cmd = "gcc -DSMALL_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" - os.system(cmd) - cmd = "gcc -DSMALL_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" - os.system(cmd) - cmd = "gcc -DSMALL_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" - os.system(cmd) - print("") - cmd = "dd if=/dev/urandom of=input.txt bs=4096 count=1" - os.system(cmd) - print("") - - cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" - start = time.time() - os.system(cmd) - end = time.time() - - passedTime = end - start - outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) - print(outputFormat + "\nFIFO TIME:", passedTime) - print("") - cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" - start = time.time() - os.system(cmd) - end = time.time() - - passedTime = end - start - print("MQSYSV TIME:", passedTime) - - - if (sys.argv[1] == '-medium'): - cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" - os.system(cmd) - cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" - os.system(cmd) - cmd = "gcc -DMEDIUM_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" - os.system(cmd) - cmd = "gcc -DMEDIUM_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" - os.system(cmd) - cmd = "gcc -DMEDIUM_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" - os.system(cmd) - cmd = "gcc -DMEDIUM_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" - os.system(cmd) - cmd = "dd if=/dev/urandom of=input.txt bs=25600 count=4096" - os.system(cmd) - print("") - - cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" - start = time.time() - os.system(cmd) - end = time.time() - - passedTime = end - start - outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) - print(outputFormat + "FIFO TIME:", passedTime) - print("") - - if (sys.argv[1] == '-large'): - cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" - os.system(cmd) - cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" - os.system(cmd) - cmd = "gcc -DLARGE_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" - os.system(cmd) - cmd = "gcc -DLARGE_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" - os.system(cmd) - cmd = "gcc -DLARGE_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" - os.system(cmd) - cmd = "gcc -DLARGE_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" - os.system(cmd) - cmd = "dd if=/dev/urandom of=input.txt bs=1048576 count=2048" - os.system(cmd) - print("") - - cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" - - start = time.time() - os.system(cmd) - end = time.time() - - passedTime = end - start - outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) - print(outputFormat + "FIFO TIME:", passedTime) - print("") - cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" - start = time.time() - os.system(cmd) - end = time.time() - - passedTime = end - start - print("MQSYSV TIME:", passedTime) - -else: - print("Write 'start.py -h' for information.") - diff --git a/task3/shm_overview.txt b/task3/shm_overview.txt deleted file mode 100644 index 053e87a..0000000 --- a/task3/shm_overview.txt +++ /dev/null @@ -1,4 +0,0 @@ -SYS V: -https://www.opennet.ru/man.shtml?topic=shmctl&category=2&russian=0 -POSIX: -https://gist.github.com/garcia556/8231e844a90457c99cc72e5add8388e4 diff --git a/task3/sysv_msgq_disclaimer.txt b/task3/sysv_msgq_disclaimer.txt deleted file mode 100644 index e0874a4..0000000 --- a/task3/sysv_msgq_disclaimer.txt +++ /dev/null @@ -1,33 +0,0 @@ -Мы с вами рассматриваем в данном разделе 2 из 3-х IPC, введённых и аппробированных в UNIX-подобных ОС, начиная со стандарта SYS V 3rd edition,поэтому они так и называются: SYS V IPC. -Соответственно, мы сначала пройдём Разделяемую память и Очереди сообщений. Семафоры, 3-й примитив, мы пройдём после ознакомления с таким понятием, как потоки(threads). -О разделяемой памяти мы уже успели поговорить и написать ряд примеров, поэтому повествование ниже будет сфокусировано на очередях сообщений, но характерные для них особенности SYS V IPC характерны и для двух других примитивов. -Для того, чтобы посмотреть текущие ресурсы SYS V IPC, наберите команду ipcs в Вашем терминале. Вывод будет в следующем формате: ------- Shared Memory Segments -------- - key shmid owner perms bytes nattch status - ------ Semaphore Arrays -------- - key semid owner perms nsems status - ------ Message Queues -------- - key msqid owner perms used-bytes messages -Из данного вывода можно заключить о характерных свойствах SYS V IPC. - -Итак, на примере очередей сообщений, разберём типовые поля из вывода команды: - - * key - ключ (имя), который присваивается очереди при ее создании - вызовом функции msgget(). - * msqid - значение, возвращаемое функцией msgget(). Является - дескриптором очереди. Любые операции над очередью сообщений - осуществляются с указанием этого дескриптора. - * owner - пользователь, создавший очередь. - * perms - восьмеричное число, определяющее права доступа к очереди. - Очень напоминает права доступа к файлам. - * used-bytes - текущее количество байт, хранящихся в очереди. - * messages - количество сообщений в очереди. - -Ключ - средство для общего доступа к некому примитиву. Каждый, кто знает его значение, сможет писать и читать данные (см. примеры с прошлого семинара). Можно сгенерировать некое целое число, которое служит ключом, и, в принципе, это годится. В случае, если нужно "скрыть" ключ, можно пользоваться макросом IPC_PRIVATE - система сама сгенерирует ключ, но никому его не отдаст. Так можно соединить связью, например, процесс-родитель и потомка, отнаследовав дескриптор на примитив, по аналогии с тем, как мы это делаем в неименованных каналах. - -Схема работы с очередями сообщений-такая же, как с другими SYS V IPC: вы делаете вызов <"IPCNAME">get, создающий примитив IPC и возвращающий файловый дескриптор. С этим дескриптором уже можно работать, как с дескриптором на регулярный файл, то есть читать из него, писать, etc. Однако примитивы IPC имеют более удобный интерфейс, например, разделяемая память позволяет настроить отображение в виртуальную память процесса и получить указатель через shmat. Очереди сообщений же позволяют отправить сообщение в очередь через msgsnd, либо принять через msgrcv. -Освободить ресурс IPC можно через характерный вызов <"IPCNAME">ctl. -Для знакомства с очередями сообщений на практике следует посмотреть примеры из директории "examples" данного примера. -Заметим, что тип отправляемого сообщения (поле .mtype) строго > 0. В msgrcv можно принимать сообщения, выставив =0, тогда будет вычитано первое сообщение из очереди, без учёта типа. mtype<0 работает куда интереснее, и позволяет реализовать приоритетную очередь: -"If msgtyp is less than 0, then the first message in the queue with the lowest type less than or equal to the absolute value of msgtyp will be read." -Также заметим, что размер отправляемого сообщения указывается без учёта поля длины (см. пример). diff --git a/task3/task.txt b/task3/task.txt deleted file mode 100644 index 72b245b..0000000 --- a/task3/task.txt +++ /dev/null @@ -1,10 +0,0 @@ -Сравнить на практике 3 способа взаимодействия между двумя процессами. -Для этого: -1) Разработать 3 программы, передающие файл произвольного (довольно большого) размера между двумя процессами с использованием следующих инструментов: - а) Разделяемая память SYS V. - б) Очереди сообщений SYS V. - в) Именованые каналы (FIFO). -2) Для каждой из программы измерить время выполнения при передаче файлов 3 характерных размеров -- малый, средний и относительно большой (что считать таковыми -- принимайте решение сами), используя утилиту time либо средства из заголовка time.h: https://ru.wikipedia.org/wiki/Time.h, проводя измерения для 2-3 характерных размеров буфера (памяти, данных в сообщении), размер-на ваше усмотрение, например: "малый" размер - менее пары сотен байт, 4 Кб, большой размер - существенно больше 4 Кб. -3) По результатам измерений постройте гистограммы времени передачи от размера буфера. На каждой гистограмме будут расположены 3 полосы, каждая для инстумента 1а, 1б, 1в соответственно. Попробовать поймать ситуации, в которых результаты будут наиболее репрезентативными. После чего следует сделать выводы и заключения. - -Важно! Не забывайте про синхронизацию там, где она не обеспечена средством IPC. diff --git a/task3/test.c b/task3/test.c deleted file mode 100644 index 7104b16..0000000 --- a/task3/test.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include -#include - -int main() -{ - sem_t* s = sem_open("/sem1", O_CREAT | 0644); - - if (s != SEM_FAILED) - sem_init(s, 1, 5); - else - perror("sem_open"); - - sem_post(s); - sem_post(s); - return 0; -} \ No newline at end of file diff --git a/task3/test1.c b/task3/test1.c deleted file mode 100644 index 1531786..0000000 --- a/task3/test1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#include -#include -#include - -int main() -{ - sem_t* s = sem_open("/sem1", O_RDWR); - - sem_wait(s); - - printf("Leaving semaphore %lu\n", getpid()); - return 0; -} \ No newline at end of file From 02436145138498d7b7d207f062f27f8d6e004ea2 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 18 Oct 2022 14:04:05 +0300 Subject: [PATCH 15/40] start.py completed, TODO graphs --- task3/examples/5_perror_fmt.c | 19 ++++ task3/examples/disclaimer.txt | 1 + task3/examples/posix_mq_client.c | 36 +++++++ task3/examples/posix_mq_server.c | 36 +++++++ task3/examples/receiver_mq_sysv.c | 36 +++++++ task3/examples/sender_mq_sysv.c | 52 +++++++++ task3/examples/shm_client_posix.c | 42 ++++++++ task3/examples/shm_server_posix.c | 38 +++++++ task3/homework/FIFO/FIFOReceiver.c | 46 ++++++++ task3/homework/FIFO/FIFOSender.c | 50 +++++++++ task3/homework/FIFO/fifo | 0 task3/homework/FIFO/output.txt | Bin 0 -> 4096 bytes task3/homework/mqSYSV/mqSYSVReceiver.c | 59 +++++++++++ task3/homework/mqSYSV/mqSYSVSender.c | 91 ++++++++++++++++ task3/homework/shmPOSIX/shmClientPOSIX.c | 93 ++++++++++++++++ task3/homework/shmPOSIX/shmServerPOSIX.c | 49 +++++++++ task3/homework/start.py | 128 +++++++++++++++++++++++ task3/shm_overview.txt | 4 + task3/sysv_msgq_disclaimer.txt | 33 ++++++ task3/task.txt | 10 ++ task3/test.c | 18 ++++ task3/test1.c | 15 +++ 22 files changed, 856 insertions(+) create mode 100644 task3/examples/5_perror_fmt.c create mode 100644 task3/examples/disclaimer.txt create mode 100644 task3/examples/posix_mq_client.c create mode 100644 task3/examples/posix_mq_server.c create mode 100644 task3/examples/receiver_mq_sysv.c create mode 100644 task3/examples/sender_mq_sysv.c create mode 100644 task3/examples/shm_client_posix.c create mode 100644 task3/examples/shm_server_posix.c create mode 100644 task3/homework/FIFO/FIFOReceiver.c create mode 100644 task3/homework/FIFO/FIFOSender.c create mode 100644 task3/homework/FIFO/fifo create mode 100644 task3/homework/FIFO/output.txt create mode 100644 task3/homework/mqSYSV/mqSYSVReceiver.c create mode 100644 task3/homework/mqSYSV/mqSYSVSender.c create mode 100644 task3/homework/shmPOSIX/shmClientPOSIX.c create mode 100644 task3/homework/shmPOSIX/shmServerPOSIX.c create mode 100644 task3/homework/start.py create mode 100644 task3/shm_overview.txt create mode 100644 task3/sysv_msgq_disclaimer.txt create mode 100644 task3/task.txt create mode 100644 task3/test.c create mode 100644 task3/test1.c diff --git a/task3/examples/5_perror_fmt.c b/task3/examples/5_perror_fmt.c new file mode 100644 index 0000000..61d9e5c --- /dev/null +++ b/task3/examples/5_perror_fmt.c @@ -0,0 +1,19 @@ +#include +#include +#include + +extern int errno; + +int main () +{ + FILE *ptrFile; + ptrFile = fopen ("fodsfksgjskgjwgjwglwrg.txt","rb"); + if (ptrFile == NULL) + { + perror("Case with prefix"); + printf( "Case with fmt string : %s\n", strerror(errno) ); + } + else + fclose (ptrFile); + return 0; +} diff --git a/task3/examples/disclaimer.txt b/task3/examples/disclaimer.txt new file mode 100644 index 0000000..8896479 --- /dev/null +++ b/task3/examples/disclaimer.txt @@ -0,0 +1 @@ +Здесь расположены некоторые характерные примеры по SYS V и POSIX IPC. Отдельные примеры не были скопированы с преподавательского компа после семинара, поэтому директория будет дополняться. diff --git a/task3/examples/posix_mq_client.c b/task3/examples/posix_mq_client.c new file mode 100644 index 0000000..f089999 --- /dev/null +++ b/task3/examples/posix_mq_client.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define SZ 4096 + +#define QNAME "/example" + +int main() { + mqd_t queue; + struct mq_attr attr; + unsigned prio = 1; + attr.mq_flags = 0; + attr.mq_msgsize = SZ; + attr.mq_curmsgs = 0; + + if ((queue = mq_open(QNAME, O_WRONLY, 0666, &attr)) == -1) { + perror("Client: mq open error"); + return 1; + } + + char buf[4096]; + strcpy(buf, "hello world"); + + if (mq_send(queue, buf, strlen(buf)+1, prio) == -1) { + perror("Client: mq send error"); + return 1; + } + + return 0; +} diff --git a/task3/examples/posix_mq_server.c b/task3/examples/posix_mq_server.c new file mode 100644 index 0000000..bbdbafc --- /dev/null +++ b/task3/examples/posix_mq_server.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include + +#define QNAME "/example" + +#define SZ 4096 + +int main() { + mqd_t server; + unsigned prio = 1; + + struct mq_attr attr; + + attr.mq_flags = 0; + attr.mq_msgsize = SZ; + attr.mq_curmsgs = 0; + + if ((server = mq_open(QNAME, O_RDONLY | O_CREAT, 0666, &attr)) == -1) { + perror("Server: mq open failed"); + return 1; + } + char buf[SZ]; + + + if (mq_receive(server, buf, SZ, NULL) == -1) { + perror ("Server: mq receive error"); + return 1; + } + printf("%s", buf); + + return 0; +} diff --git a/task3/examples/receiver_mq_sysv.c b/task3/examples/receiver_mq_sysv.c new file mode 100644 index 0000000..eb8045e --- /dev/null +++ b/task3/examples/receiver_mq_sysv.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include + +#define MSG_SIZE 1024 // < /proc/sys/fs/mqueue/msg_max + + +typedef struct msgbuf { + long mtype; + char mtext[MSG_SIZE]; +} message_buf; + + +int main() +{ + int msqid; + key_t key; + message_buf rbuf; + + key = 10; + + if ((msqid = msgget(key, 0666)) < 0) { + perror("msgget"); + exit(1); + } + + + if (msgrcv(msqid, &rbuf, MSG_SIZE, 1, 0) < 0) { + perror("msgrcv"); + exit(1); + } + + printf("%s\n", rbuf.mtext); + return 0; +} diff --git a/task3/examples/sender_mq_sysv.c b/task3/examples/sender_mq_sysv.c new file mode 100644 index 0000000..1e6ad42 --- /dev/null +++ b/task3/examples/sender_mq_sysv.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include + +#define MSG_SIZE 1024 +// нужна структурка данных, в которой хранится тип сообщения и буфер +typedef struct msgbuf { + long mtype; + char mtext[MSG_SIZE]; + } message_buf; + +main() +{ + int msqid; + int msgflg = IPC_CREAT | 0666; + key_t key; + message_buf sbuf; + size_t buf_length; + + key = 1024; //rewrite with ftok + + if ((msqid = msgget(key, msgflg )) < 0) { + perror("msgget"); + exit(1); + } + else + printf("msgget: msgget succeeded: msqid = %d\n", msqid); + + + sbuf.mtype = 1; + + printf("msgget: msgget succeeded: msqid = %d\n", msqid); + + (void) strcpy(sbuf.mtext, "HELLO"); + + printf("msgget: msgget succeeded: msqid = %d\n", msqid); + + buf_length = strlen(sbuf.mtext) + 1 ; // данные сообщения по прежнему считаем '\0'-terminated - строкой. + + if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) { + printf ("%d, %d, %s, %d\n", msqid, sbuf.mtype, sbuf.mtext, buf_length); + perror("msgsnd"); + exit(1); + } + + else + printf("Message: \"%s\" Sent\n", sbuf.mtext); + + return 0; +} diff --git a/task3/examples/shm_client_posix.c b/task3/examples/shm_client_posix.c new file mode 100644 index 0000000..078057c --- /dev/null +++ b/task3/examples/shm_client_posix.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include + +int main() +{ + /* the size (in bytes) of shared memory object */ + const int SIZE = 4096; + + /* name of the shared memory object */ + const char* name = "OS"; + + /* strings written to shared memory */ + const char* message_0 = "Hello"; + const char* message_1 = "World!"; + + /* shared memory file descriptor */ + int shm_fd; + + /* pointer to shared memory object */ + void* ptr; + + /* create the shared memory object */ + shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); + + /* configure the size of the shared memory object */ + ftruncate(shm_fd, SIZE); + + /* memory map the shared memory object */ + ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); + + /* write to the shared memory object */ + sprintf(ptr, "%s", message_0); + + ptr += strlen(message_0); + sprintf(ptr, "%s", message1); + ptr += strlen(message_1); + return 0; +} \ No newline at end of file diff --git a/task3/examples/shm_server_posix.c b/task3/examples/shm_server_posix.c new file mode 100644 index 0000000..ddebc94 --- /dev/null +++ b/task3/examples/shm_server_posix.c @@ -0,0 +1,38 @@ +// C program for Consumer process illustrating +// POSIX shared-memory API. +// monitor it using ipcs +// lsof -p 16894 +// fuser some-huge-file.txt +#include +#include +#include +#include +#include + +int main() +{ + /* the size (in bytes) of shared memory object */ + const int SIZE = 4096; + + /* name of the shared memory object */ + const char* name = "OS"; + + /* shared memory file descriptor */ + int shm_fd; + + /* pointer to shared memory object */ + void* ptr; + + /* open the shared memory object */ + shm_fd = shm_open(name, O_RDONLY, 0666); + + /* memory map the shared memory object */ + ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); + + /* read from the shared memory object */ + printf("%s", (char*)ptr); + + /* remove the shared memory object */ + shm_unlink(name); + return 0; +} \ No newline at end of file diff --git a/task3/homework/FIFO/FIFOReceiver.c b/task3/homework/FIFO/FIFOReceiver.c new file mode 100644 index 0000000..8ab1878 --- /dev/null +++ b/task3/homework/FIFO/FIFOReceiver.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include + +#define FIFO "fifo" + +#define DEFAULT_SIZE 512 + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + + +int main() +{ + mknod(FIFO, S_IFIFO | 0666, 0); + printf("Waiting for a writer\n"); + int fd = open(FIFO, O_RDONLY); + printf("A writer is connected\n"); + + int size = 0; + + char buf[DEFAULT_SIZE]; + + FILE* out = fopen("./FIFO/output.txt", "w"); + + while ((size = read(fd, buf, sizeof(buf))) > 0) + { + fwrite(buf, sizeof(char), size, out); + } + + close(fd); + fclose(out); + return 0; +} \ No newline at end of file diff --git a/task3/homework/FIFO/FIFOSender.c b/task3/homework/FIFO/FIFOSender.c new file mode 100644 index 0000000..6b72647 --- /dev/null +++ b/task3/homework/FIFO/FIFOSender.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_SIZE 512 +#define FIFO "fifo" + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + + +int main() +{ + mknod(FIFO, S_IFIFO | 0666, 0); + printf("Waiting for a reader\n"); + int fd_FIFO = open(FIFO, O_WRONLY); + int fd_in = open("./input.txt", O_RDONLY); + if (fd_in < 0) + { + fprintf(stderr, "FILE NOT FOUND\n"); + } + printf("A reader is connected\n"); + + int size = 0; + + char buf[DEFAULT_SIZE]; + + while ((size = read(fd_in, buf, sizeof(buf))) > 0) + { + write(fd_FIFO, buf, size); + } + + close(fd_FIFO); + close(fd_in); + + return 0; +} \ No newline at end of file diff --git a/task3/homework/FIFO/fifo b/task3/homework/FIFO/fifo new file mode 100644 index 0000000..e69de29 diff --git a/task3/homework/FIFO/output.txt b/task3/homework/FIFO/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..5583a26d7f5b0ee1e62b5d3821307c93731bbc1a GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/task3/homework/mqSYSV/mqSYSVReceiver.c b/task3/homework/mqSYSV/mqSYSVReceiver.c new file mode 100644 index 0000000..d343168 --- /dev/null +++ b/task3/homework/mqSYSV/mqSYSVReceiver.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_KEY 1337 +#define MAX_MSG_SIZE 4096 +#define DEFAULT_TYPE 1488 + + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + +typedef struct msgbuf +{ + long mtype; + char mtext[MAX_MSG_SIZE]; +} message_buf; + + +int main() +{ + int msqid = -1; + key_t key = DEFAULT_KEY; + message_buf rbuf; + rbuf.mtype = DEFAULT_TYPE; + + if ((msqid = msgget(key, 0666)) < 0) + { + perror("msgget"); + exit(1); + } + + + for (size_t bytes = SIZE; bytes > 0;) + { + if (msgrcv(msqid, &rbuf, MAX_MSG_SIZE, DEFAULT_TYPE, 0) < 0) + { + perror("msg:"); + exit(1); + } + + bytes-=MAX_MSG_SIZE; + } + + return 0; +} \ No newline at end of file diff --git a/task3/homework/mqSYSV/mqSYSVSender.c b/task3/homework/mqSYSV/mqSYSVSender.c new file mode 100644 index 0000000..a1a8de9 --- /dev/null +++ b/task3/homework/mqSYSV/mqSYSVSender.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include +#include +#include + + +#define DEFAULT_KEY 1337 +#define DEFAULT_TYPE 1488 +#define MAX_MSG_SIZE 4096 + + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483648 +#endif + +typedef struct msgbuf +{ + long mtype; + char mtext[MAX_MSG_SIZE]; +} message_buf; + + +int findFileSize(FILE* in) +{ + assert(in); + + int fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + + +int main() +{ + int msqid = -1; + int msgflg = IPC_CREAT | 0666; + key_t key = DEFAULT_KEY; + message_buf sbuf; + sbuf.mtype = DEFAULT_TYPE; + + + if ((msqid = msgget(key, msgflg)) < 0) + { + perror("msgget"); + exit(1); + } + else + printf("msgget: msgget succeeded: msqid = %d\n", msqid); + + + FILE* in = fopen("./input.txt", "r"); + if (!in) + { + fprintf(stderr,"FILE NOT FOUND\n"); + return 1; + } + + + for (size_t bytes = SIZE; bytes > 0;) + { + fread(sbuf.mtext, sizeof(char), MAX_MSG_SIZE, in); + sleep(0,01); + if (msgsnd(msqid, &sbuf, MAX_MSG_SIZE, IPC_NOWAIT) < 0) + { + perror("msg:"); + exit(1); + } + bytes-=MAX_MSG_SIZE; + } + + fclose(in); + + return 0; +} diff --git a/task3/homework/shmPOSIX/shmClientPOSIX.c b/task3/homework/shmPOSIX/shmClientPOSIX.c new file mode 100644 index 0000000..e183502 --- /dev/null +++ b/task3/homework/shmPOSIX/shmClientPOSIX.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +const char* name = "HESOYAM"; + +#define DEFAULT_SIZE 512 + + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483649 +#endif + + +size_t findFileSize(FILE* in) +{ + assert(in); + + size_t fileSize = 0; + + fseek (in, 0, SEEK_END); + + fileSize = ftell (in); + + fseek (in, 0, SEEK_SET); + + return (fileSize); +} + + +int main() +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); + + ftruncate(shm_fd, SIZE); + + ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + char inBuf[DEFAULT_SIZE]; + + FILE* in = fopen("./input.txt", "r"); + if (!in) + { + fprintf(stderr, "File not found\n"); + return 1; + } + + + size_t file_size = findFileSize(in); + + if (file_size >= SIZE) + { + fprintf(stderr, "DATA TOO BIG\n"); + return 1; + } + + size_t rSize = 0; + size_t counter = 0; + while(rSize = fread((char*)(ptr + rSize), sizeof(char), DEFAULT_SIZE, in) > 0) + { + counter++; + } + + + fprintf(stdout, "Packets of %d bytes = %lu\n", DEFAULT_SIZE, counter); + + fclose(in); + + return 0; +} \ No newline at end of file diff --git a/task3/homework/shmPOSIX/shmServerPOSIX.c b/task3/homework/shmPOSIX/shmServerPOSIX.c new file mode 100644 index 0000000..f9ae6c5 --- /dev/null +++ b/task3/homework/shmPOSIX/shmServerPOSIX.c @@ -0,0 +1,49 @@ +// C program for Consumer process illustrating +// POSIX shared-memory API. +// monitor it using ipcs +// lsof -p 16894 +// fuser some-huge-file.txt +#include +#include +#include +#include +#include +#include + +const char* name = "HESOYAM"; + +#define DEFAULT_SIZE 512 + +#ifdef SMALL_SIZE +#define SIZE 4096 +#endif + +#ifdef MEDIUM_SIZE +#define SIZE 104857600 +#endif + +#ifdef LARGE_SIZE +#define SIZE 2147483649 +#endif + + +int main() +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_RDONLY, 0666); + + ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + + shm_unlink(name); + return 0; +} \ No newline at end of file diff --git a/task3/homework/start.py b/task3/homework/start.py new file mode 100644 index 0000000..b9e40b4 --- /dev/null +++ b/task3/homework/start.py @@ -0,0 +1,128 @@ +import os +import sys +import time + + +## hate makefiles.... +class ANSI(): + def background(code): + return "\33[{code}m".format(code=code) + + def style_text(code): + return "\33[{code}m".format(code=code) + + def color_text(code): + return "\33[{code}m".format(code=code) + + +argc = len(sys.argv) + +if (argc > 1): + if (sys.argv[1] == "-h"): + print("Write 'start.py -small' for testing with SMALL_SIZE") + print("Write 'start.py -medium' for testing with MEDIUM_SIZE") + print("Write 'start.py -large' for testing with LARGE_SIZE") + exit() + + + if (sys.argv[1] == '-small'): + cmd = "gcc -DSMALL_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DSMALL_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" + os.system(cmd) + print("") + cmd = "dd if=/dev/urandom of=input.txt bs=4096 count=1" + os.system(cmd) + print("") + + cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) + print(outputFormat + "\nFIFO TIME:", passedTime) + print("") + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("MQSYSV TIME:", passedTime) + + + if (sys.argv[1] == '-medium'): + cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DMEDIUM_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" + os.system(cmd) + cmd = "dd if=/dev/urandom of=input.txt bs=25600 count=4096" + os.system(cmd) + print("") + + cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) + print(outputFormat + "FIFO TIME:", passedTime) + print("") + + if (sys.argv[1] == '-large'): + cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVReceiver.c -o ./mqSYSV/mqSYSVReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./shmPOSIX/shmClientPOSIX.c -o ./shmPOSIX/shmClientPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./shmPOSIX/shmServerPOSIX.c -o ./shmPOSIX/shmServerPOSIX.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./FIFO/FIFOReceiver.c -o ./FIFO/FIFOReceiver.out -lrt" + os.system(cmd) + cmd = "gcc -DLARGE_SIZE ./FIFO/FIFOSender.c -o ./FIFO/FIFOSender.out -lrt" + os.system(cmd) + cmd = "dd if=/dev/urandom of=input.txt bs=1048576 count=2048" + os.system(cmd) + print("") + + cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" + + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) + print(outputFormat + "FIFO TIME:", passedTime) + print("") + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("MQSYSV TIME:", passedTime) + +else: + print("Write 'start.py -h' for information.") + diff --git a/task3/shm_overview.txt b/task3/shm_overview.txt new file mode 100644 index 0000000..053e87a --- /dev/null +++ b/task3/shm_overview.txt @@ -0,0 +1,4 @@ +SYS V: +https://www.opennet.ru/man.shtml?topic=shmctl&category=2&russian=0 +POSIX: +https://gist.github.com/garcia556/8231e844a90457c99cc72e5add8388e4 diff --git a/task3/sysv_msgq_disclaimer.txt b/task3/sysv_msgq_disclaimer.txt new file mode 100644 index 0000000..e0874a4 --- /dev/null +++ b/task3/sysv_msgq_disclaimer.txt @@ -0,0 +1,33 @@ +Мы с вами рассматриваем в данном разделе 2 из 3-х IPC, введённых и аппробированных в UNIX-подобных ОС, начиная со стандарта SYS V 3rd edition,поэтому они так и называются: SYS V IPC. +Соответственно, мы сначала пройдём Разделяемую память и Очереди сообщений. Семафоры, 3-й примитив, мы пройдём после ознакомления с таким понятием, как потоки(threads). +О разделяемой памяти мы уже успели поговорить и написать ряд примеров, поэтому повествование ниже будет сфокусировано на очередях сообщений, но характерные для них особенности SYS V IPC характерны и для двух других примитивов. +Для того, чтобы посмотреть текущие ресурсы SYS V IPC, наберите команду ipcs в Вашем терминале. Вывод будет в следующем формате: +------ Shared Memory Segments -------- + key shmid owner perms bytes nattch status + ------ Semaphore Arrays -------- + key semid owner perms nsems status + ------ Message Queues -------- + key msqid owner perms used-bytes messages +Из данного вывода можно заключить о характерных свойствах SYS V IPC. + +Итак, на примере очередей сообщений, разберём типовые поля из вывода команды: + + * key - ключ (имя), который присваивается очереди при ее создании + вызовом функции msgget(). + * msqid - значение, возвращаемое функцией msgget(). Является + дескриптором очереди. Любые операции над очередью сообщений + осуществляются с указанием этого дескриптора. + * owner - пользователь, создавший очередь. + * perms - восьмеричное число, определяющее права доступа к очереди. + Очень напоминает права доступа к файлам. + * used-bytes - текущее количество байт, хранящихся в очереди. + * messages - количество сообщений в очереди. + +Ключ - средство для общего доступа к некому примитиву. Каждый, кто знает его значение, сможет писать и читать данные (см. примеры с прошлого семинара). Можно сгенерировать некое целое число, которое служит ключом, и, в принципе, это годится. В случае, если нужно "скрыть" ключ, можно пользоваться макросом IPC_PRIVATE - система сама сгенерирует ключ, но никому его не отдаст. Так можно соединить связью, например, процесс-родитель и потомка, отнаследовав дескриптор на примитив, по аналогии с тем, как мы это делаем в неименованных каналах. + +Схема работы с очередями сообщений-такая же, как с другими SYS V IPC: вы делаете вызов <"IPCNAME">get, создающий примитив IPC и возвращающий файловый дескриптор. С этим дескриптором уже можно работать, как с дескриптором на регулярный файл, то есть читать из него, писать, etc. Однако примитивы IPC имеют более удобный интерфейс, например, разделяемая память позволяет настроить отображение в виртуальную память процесса и получить указатель через shmat. Очереди сообщений же позволяют отправить сообщение в очередь через msgsnd, либо принять через msgrcv. +Освободить ресурс IPC можно через характерный вызов <"IPCNAME">ctl. +Для знакомства с очередями сообщений на практике следует посмотреть примеры из директории "examples" данного примера. +Заметим, что тип отправляемого сообщения (поле .mtype) строго > 0. В msgrcv можно принимать сообщения, выставив =0, тогда будет вычитано первое сообщение из очереди, без учёта типа. mtype<0 работает куда интереснее, и позволяет реализовать приоритетную очередь: +"If msgtyp is less than 0, then the first message in the queue with the lowest type less than or equal to the absolute value of msgtyp will be read." +Также заметим, что размер отправляемого сообщения указывается без учёта поля длины (см. пример). diff --git a/task3/task.txt b/task3/task.txt new file mode 100644 index 0000000..72b245b --- /dev/null +++ b/task3/task.txt @@ -0,0 +1,10 @@ +Сравнить на практике 3 способа взаимодействия между двумя процессами. +Для этого: +1) Разработать 3 программы, передающие файл произвольного (довольно большого) размера между двумя процессами с использованием следующих инструментов: + а) Разделяемая память SYS V. + б) Очереди сообщений SYS V. + в) Именованые каналы (FIFO). +2) Для каждой из программы измерить время выполнения при передаче файлов 3 характерных размеров -- малый, средний и относительно большой (что считать таковыми -- принимайте решение сами), используя утилиту time либо средства из заголовка time.h: https://ru.wikipedia.org/wiki/Time.h, проводя измерения для 2-3 характерных размеров буфера (памяти, данных в сообщении), размер-на ваше усмотрение, например: "малый" размер - менее пары сотен байт, 4 Кб, большой размер - существенно больше 4 Кб. +3) По результатам измерений постройте гистограммы времени передачи от размера буфера. На каждой гистограмме будут расположены 3 полосы, каждая для инстумента 1а, 1б, 1в соответственно. Попробовать поймать ситуации, в которых результаты будут наиболее репрезентативными. После чего следует сделать выводы и заключения. + +Важно! Не забывайте про синхронизацию там, где она не обеспечена средством IPC. diff --git a/task3/test.c b/task3/test.c new file mode 100644 index 0000000..7104b16 --- /dev/null +++ b/task3/test.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include + +int main() +{ + sem_t* s = sem_open("/sem1", O_CREAT | 0644); + + if (s != SEM_FAILED) + sem_init(s, 1, 5); + else + perror("sem_open"); + + sem_post(s); + sem_post(s); + return 0; +} \ No newline at end of file diff --git a/task3/test1.c b/task3/test1.c new file mode 100644 index 0000000..1531786 --- /dev/null +++ b/task3/test1.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include + +int main() +{ + sem_t* s = sem_open("/sem1", O_RDWR); + + sem_wait(s); + + printf("Leaving semaphore %lu\n", getpid()); + return 0; +} \ No newline at end of file From b88a853347527950a451239b55ee417ae1db64ce Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Sun, 23 Oct 2022 10:14:47 -0700 Subject: [PATCH 16/40] Delete fifo --- task3/homework/FIFO/fifo | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 task3/homework/FIFO/fifo diff --git a/task3/homework/FIFO/fifo b/task3/homework/FIFO/fifo deleted file mode 100644 index e69de29..0000000 From 275575742b6b80c0f91cc54cb4f01309ede19651 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Sun, 23 Oct 2022 10:14:54 -0700 Subject: [PATCH 17/40] Delete output.txt --- task3/homework/FIFO/output.txt | Bin 4096 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 task3/homework/FIFO/output.txt diff --git a/task3/homework/FIFO/output.txt b/task3/homework/FIFO/output.txt deleted file mode 100644 index 5583a26d7f5b0ee1e62b5d3821307c93731bbc1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 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 From b4e343bde9c8033f536c9464a2bc429958001b7e Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Sun, 23 Oct 2022 11:32:50 -0700 Subject: [PATCH 18/40] get all data, TODO graphs --- task3/homework/.gitignore | 8 ++++ task3/homework/FIFO/FIFOReceiver.c | 2 +- task3/homework/FIFO/FIFOSender.c | 2 +- task3/homework/FIFO/fifo | 0 task3/homework/FIFO/output.txt | Bin 4096 -> 4096 bytes task3/homework/mqSYSV/mqSYSVReceiver.c | 2 +- task3/homework/mqSYSV/mqSYSVSender.c | 10 ++-- task3/homework/shmPOSIX/shmClientPOSIX.c | 6 +-- task3/homework/shmPOSIX/shmServerPOSIX.c | 9 ++-- task3/homework/start.py | 58 +++++++++++++++++++++-- 10 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 task3/homework/.gitignore delete mode 100644 task3/homework/FIFO/fifo diff --git a/task3/homework/.gitignore b/task3/homework/.gitignore new file mode 100644 index 0000000..edd9727 --- /dev/null +++ b/task3/homework/.gitignore @@ -0,0 +1,8 @@ +FIFO/FIFOReceiver.out +FIFO/FIFOSender.out +mqSYSV/mqSYSVReceiver.out +mqSYSV/mqSYSVSender.out +shmPOSIX/shmClientPOSIX.out +shmPOSIX/shmServerPOSIX.out +input.txt +FIFO/output.txt \ No newline at end of file diff --git a/task3/homework/FIFO/FIFOReceiver.c b/task3/homework/FIFO/FIFOReceiver.c index 8ab1878..d4e7b79 100644 --- a/task3/homework/FIFO/FIFOReceiver.c +++ b/task3/homework/FIFO/FIFOReceiver.c @@ -7,7 +7,7 @@ #define FIFO "fifo" -#define DEFAULT_SIZE 512 +#define DEFAULT_SIZE 65536 #ifdef SMALL_SIZE #define SIZE 4096 diff --git a/task3/homework/FIFO/FIFOSender.c b/task3/homework/FIFO/FIFOSender.c index 6b72647..d5c1a84 100644 --- a/task3/homework/FIFO/FIFOSender.c +++ b/task3/homework/FIFO/FIFOSender.c @@ -6,7 +6,7 @@ #include -#define DEFAULT_SIZE 512 +#define DEFAULT_SIZE 65536 #define FIFO "fifo" #ifdef SMALL_SIZE diff --git a/task3/homework/FIFO/fifo b/task3/homework/FIFO/fifo deleted file mode 100644 index e69de29..0000000 diff --git a/task3/homework/FIFO/output.txt b/task3/homework/FIFO/output.txt index 5583a26d7f5b0ee1e62b5d3821307c93731bbc1a..9e543e547d118ca1f91d5312c928c37ae9327890 100644 GIT binary patch literal 4096 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 literal 4096 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 diff --git a/task3/homework/mqSYSV/mqSYSVReceiver.c b/task3/homework/mqSYSV/mqSYSVReceiver.c index d343168..5fca4f0 100644 --- a/task3/homework/mqSYSV/mqSYSVReceiver.c +++ b/task3/homework/mqSYSV/mqSYSVReceiver.c @@ -48,7 +48,7 @@ int main() { if (msgrcv(msqid, &rbuf, MAX_MSG_SIZE, DEFAULT_TYPE, 0) < 0) { - perror("msg:"); + perror("msg in RECEIVER:"); exit(1); } diff --git a/task3/homework/mqSYSV/mqSYSVSender.c b/task3/homework/mqSYSV/mqSYSVSender.c index a1a8de9..e7edc81 100644 --- a/task3/homework/mqSYSV/mqSYSVSender.c +++ b/task3/homework/mqSYSV/mqSYSVSender.c @@ -72,14 +72,14 @@ int main() return 1; } - for (size_t bytes = SIZE; bytes > 0;) - { + { fread(sbuf.mtext, sizeof(char), MAX_MSG_SIZE, in); - sleep(0,01); - if (msgsnd(msqid, &sbuf, MAX_MSG_SIZE, IPC_NOWAIT) < 0) + + if (msgsnd(msqid, &sbuf, MAX_MSG_SIZE, 0) < 0) { - perror("msg:"); + perror("msg in SENDER:"); + msgctl(msqid, IPC_RMID, NULL); exit(1); } bytes-=MAX_MSG_SIZE; diff --git a/task3/homework/shmPOSIX/shmClientPOSIX.c b/task3/homework/shmPOSIX/shmClientPOSIX.c index e183502..b231945 100644 --- a/task3/homework/shmPOSIX/shmClientPOSIX.c +++ b/task3/homework/shmPOSIX/shmClientPOSIX.c @@ -9,15 +9,15 @@ const char* name = "HESOYAM"; -#define DEFAULT_SIZE 512 +#define DEFAULT_SIZE 65536 #ifdef SMALL_SIZE -#define SIZE 4096 +#define SIZE 4097 #endif #ifdef MEDIUM_SIZE -#define SIZE 104857600 +#define SIZE 104857601 #endif #ifdef LARGE_SIZE diff --git a/task3/homework/shmPOSIX/shmServerPOSIX.c b/task3/homework/shmPOSIX/shmServerPOSIX.c index f9ae6c5..112eb60 100644 --- a/task3/homework/shmPOSIX/shmServerPOSIX.c +++ b/task3/homework/shmPOSIX/shmServerPOSIX.c @@ -12,14 +12,14 @@ const char* name = "HESOYAM"; -#define DEFAULT_SIZE 512 +#define DEFAULT_SIZE 65536 #ifdef SMALL_SIZE -#define SIZE 4096 +#define SIZE 4097 #endif #ifdef MEDIUM_SIZE -#define SIZE 104857600 +#define SIZE 104857601 #endif #ifdef LARGE_SIZE @@ -29,10 +29,13 @@ const char* name = "HESOYAM"; int main() { + sleep(0,0001); + int shm_fd = -1; void* ptr = NULL; + shm_fd = shm_open(name, O_RDONLY, 0666); ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); diff --git a/task3/homework/start.py b/task3/homework/start.py index b9e40b4..2efc67d 100644 --- a/task3/homework/start.py +++ b/task3/homework/start.py @@ -50,16 +50,26 @@ def color_text(code): passedTime = end - start outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) - print(outputFormat + "\nFIFO TIME:", passedTime) + print(outputFormat + "FIFO TIME:", passedTime) print("") + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" start = time.time() os.system(cmd) end = time.time() passedTime = end - start - print("MQSYSV TIME:", passedTime) - + print("MESSAGE QUEUE SYSV TIME:", passedTime) + print("") + + cmd = "./shmPOSIX/shmClientPOSIX.out & ./shmPOSIX/shmServerPOSIX.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("SHARED MEMORY POSIX TIME:", passedTime) + print("") if (sys.argv[1] == '-medium'): cmd = "gcc -DMEDIUM_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" @@ -87,6 +97,24 @@ def color_text(code): outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) print(outputFormat + "FIFO TIME:", passedTime) print("") + + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("MESSAGE QUEUE SYSV TIME:", passedTime) + print("") + + cmd = "./shmPOSIX/shmClientPOSIX.out & ./shmPOSIX/shmServerPOSIX.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("SHARED MEMORY POSIX TIME:", passedTime) + print("") if (sys.argv[1] == '-large'): cmd = "gcc -DLARGE_SIZE ./mqSYSV/mqSYSVSender.c -o ./mqSYSV/mqSYSVSender.out -lrt" @@ -106,7 +134,6 @@ def color_text(code): print("") cmd = "./FIFO/FIFOReceiver.out & ./FIFO/FIFOSender.out" - start = time.time() os.system(cmd) end = time.time() @@ -115,14 +142,35 @@ def color_text(code): outputFormat = ANSI.background(49) + ANSI.color_text(31) + ANSI.style_text(7) print(outputFormat + "FIFO TIME:", passedTime) print("") + cmd = "./mqSYSV/mqSYSVReceiver.out & ./mqSYSV/mqSYSVSender.out" start = time.time() os.system(cmd) end = time.time() passedTime = end - start - print("MQSYSV TIME:", passedTime) + print("MESSAGE QUEUE SYSV TIME:", passedTime) + print("") + + cmd = "./shmPOSIX/shmClientPOSIX.out & ./shmPOSIX/shmServerPOSIX.out" + start = time.time() + os.system(cmd) + end = time.time() + + passedTime = end - start + print("SHARED MEMORY POSIX TIME:", passedTime) + print("") else: print("Write 'start.py -h' for information.") + +# -small BUF SIZE 512 FIFO 0.00245 MSQ 0.00228 SHM 0.00584 +# -medium BUF SIZE 512 FIFO 0.39691 MSQ 1.19831 SHM 0.00657 +# -large BUF SIZE 512 FIFO 16.18651 MSQ 15.76633 SHM 0.00860 +# -small BUF SIZE 4096 FIFO 0.00481 MSQ 0.00231 SHM 0.00280 +# -medium BUF SIZE 4096 FIFO 0.25731 MSQ 0.23929 SHM 0.00410 +# -large BUF SIZE 4096 FIFO 4.94263 MSQ 12.67133 SHM 0.00595 +# -small BUF SIZE 65536 FIFO 0.00284 ------------ SHM 0.00234 +# -medium BUF SIZE 65536 FIFO 0.25731 ------------ SHM 0.00351 +# -large BUF SIZE 65536 FIFO 3.57521 ------------ SHM 0.00337 \ No newline at end of file From c5f1525263890dbedbe87cdf338c49254d9088be Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Sun, 23 Oct 2022 11:34:14 -0700 Subject: [PATCH 19/40] Create README.md --- task3/homework/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 task3/homework/README.md diff --git a/task3/homework/README.md b/task3/homework/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/task3/homework/README.md @@ -0,0 +1 @@ + From 274a7305e1772f60e2e0ebabf7aae6cc21a68cbd Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Sun, 23 Oct 2022 12:10:20 -0700 Subject: [PATCH 20/40] Update README.md --- task3/homework/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/task3/homework/README.md b/task3/homework/README.md index 8b13789..7164907 100644 --- a/task3/homework/README.md +++ b/task3/homework/README.md @@ -1 +1,28 @@ +# HW 3 +## Interprocessor Communication Analysis + +### LAUNCH +__Calling the help line__
+```bash + python3 start.py -help +``` +__Start tests__
+``` bash + python3 start.py -flag +``` +___FLAGS:___ ```-small```, ```-medium```, ```-large```
+ +### Tests were carried out with these parameters + +|FLAG | -small |-medium|-large| +|------|--------|-------|------| +|INPUT | 4kB | 104Mb |2.1Gb | + + +|BUF IN BYTES |512 | 4096 | 65536 | +|--------------|----|------|-------| + + +### GRAPH: + From d48bba13bc7d6e946bbf8cf84f1f55599d3399f8 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Sun, 23 Oct 2022 12:26:36 -0700 Subject: [PATCH 21/40] Update README.md --- task3/homework/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/task3/homework/README.md b/task3/homework/README.md index 7164907..5083fd2 100644 --- a/task3/homework/README.md +++ b/task3/homework/README.md @@ -26,3 +26,11 @@ ___FLAGS:___ ```-small```, ```-medium```, ```-large```
### GRAPH: + + +### CONCLUSION: + +The most effective in these tests was ___virtual-shared memory___, which allows you to immediately access data from another process,
+without the preliminary cost of reading.
+__Message queue__ is the most efficient for sending short messages. +__FIFO__ stably keeps in the middle among all and the easiest method to implement. From 90ead6b59c176698b5cfff666a2dcbc4358743c3 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Sun, 23 Oct 2022 12:26:51 -0700 Subject: [PATCH 22/40] Update README.md --- task3/homework/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/task3/homework/README.md b/task3/homework/README.md index 5083fd2..db2670d 100644 --- a/task3/homework/README.md +++ b/task3/homework/README.md @@ -32,5 +32,5 @@ ___FLAGS:___ ```-small```, ```-medium```, ```-large```
The most effective in these tests was ___virtual-shared memory___, which allows you to immediately access data from another process,
without the preliminary cost of reading.
-__Message queue__ is the most efficient for sending short messages. -__FIFO__ stably keeps in the middle among all and the easiest method to implement. +__Message queue__ is the most efficient for sending short messages.
+__FIFO__ stably keeps in the middle among all and the easiest method to implement.
From b884660185cfb55153c2192ec34a2352579b0ae1 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 25 Oct 2022 06:13:32 -0700 Subject: [PATCH 23/40] Graph completed --- img/large.png | Bin 0 -> 17350 bytes img/medium.png | Bin 0 -> 20004 bytes img/small.png | Bin 0 -> 20722 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/large.png create mode 100644 img/medium.png create mode 100644 img/small.png diff --git a/img/large.png b/img/large.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e0cde4ffefbe21c6db3fc5f1fe3bc70e303b04 GIT binary patch literal 17350 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 Jb({7c|6k@g3={wW literal 0 HcmV?d00001 diff --git a/img/medium.png b/img/medium.png new file mode 100644 index 0000000000000000000000000000000000000000..25ada87076f481a2cbb59d51d3e20788e1ba3804 GIT binary patch literal 20004 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

aJZm+cQ%NeHTw&#Cf*Q+Z+jXTkmM=DEaj2DJO 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 Sz+dGPx^UJ|FXznl2mcH6;)ZGf literal 0 HcmV?d00001 From 37d4d3ca5a90d7315fb258efbeb0aef8579a5118 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 25 Oct 2022 16:13:45 +0300 Subject: [PATCH 24/40] Delete img directory --- img/large.png | Bin 17350 -> 0 bytes img/medium.png | Bin 20004 -> 0 bytes img/small.png | Bin 20722 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/large.png delete mode 100644 img/medium.png delete mode 100644 img/small.png diff --git a/img/large.png b/img/large.png deleted file mode 100644 index c7e0cde4ffefbe21c6db3fc5f1fe3bc70e303b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17350 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 Jb({7c|6k@g3={wW diff --git a/img/medium.png b/img/medium.png deleted file mode 100644 index 25ada87076f481a2cbb59d51d3e20788e1ba3804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20004 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

aJZm+cQ%NeHTw&#Cf*Q+Z+jXTkmM=DEaj2DJO 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 Sz+dGPx^UJ|FXznl2mcH6;)ZGf From 11115f84dff111936937acc37e8e7c3252a03ec7 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 25 Oct 2022 06:14:13 -0700 Subject: [PATCH 25/40] Graph completed --- task3/homework/img/large.png | Bin 0 -> 17350 bytes task3/homework/img/medium.png | Bin 0 -> 20004 bytes task3/homework/img/small.png | Bin 0 -> 20722 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 task3/homework/img/large.png create mode 100644 task3/homework/img/medium.png create mode 100644 task3/homework/img/small.png diff --git a/task3/homework/img/large.png b/task3/homework/img/large.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e0cde4ffefbe21c6db3fc5f1fe3bc70e303b04 GIT binary patch literal 17350 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 Jb({7c|6k@g3={wW literal 0 HcmV?d00001 diff --git a/task3/homework/img/medium.png b/task3/homework/img/medium.png new file mode 100644 index 0000000000000000000000000000000000000000..25ada87076f481a2cbb59d51d3e20788e1ba3804 GIT binary patch literal 20004 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

aJZm+cQ%NeHTw&#Cf*Q+Z+jXTkmM=DEaj2DJO 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 Sz+dGPx^UJ|FXznl2mcH6;)ZGf literal 0 HcmV?d00001 From 39943030395a56fb316eed272ad0754ccf8879d6 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 25 Oct 2022 16:18:31 +0300 Subject: [PATCH 26/40] Completed --- task3/homework/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/task3/homework/README.md b/task3/homework/README.md index db2670d..94a73f3 100644 --- a/task3/homework/README.md +++ b/task3/homework/README.md @@ -26,6 +26,11 @@ ___FLAGS:___ ```-small```, ```-medium```, ```-large```
### GRAPH: +![Imaga small](https://github.com/shaazmik/3_sem_22_23/blob/main/task3/homework/img/small.png?raw=true) +
+![Image medium](https://github.com/shaazmik/3_sem_22_23/blob/main/task3/homework/img/medium.png?raw=true) +
+![Image large](https://github.com/shaazmik/3_sem_22_23/blob/main/task3/homework/img/large.png?raw=true) ### CONCLUSION: From fbb01f902904ee9b476535238dbffbed5dc80b8c Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Tue, 25 Oct 2022 16:37:55 +0300 Subject: [PATCH 27/40] cosmetic --- task3/homework/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task3/homework/README.md b/task3/homework/README.md index 94a73f3..b9659dd 100644 --- a/task3/homework/README.md +++ b/task3/homework/README.md @@ -17,7 +17,7 @@ ___FLAGS:___ ```-small```, ```-medium```, ```-large```
|FLAG | -small |-medium|-large| |------|--------|-------|------| -|INPUT | 4kB | 104Mb |2.1Gb | +|INPUT | 4kB | 104MB |2.1GB | |BUF IN BYTES |512 | 4096 | 65536 | From 117cb53ea825d066d872e047bc33f019a6546252 Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Thu, 27 Oct 2022 07:30:53 -0700 Subject: [PATCH 28/40] base functions --- task4/homework/integral.h | 17 +++++++++++++ task4/homework/main.c | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 task4/homework/integral.h create mode 100644 task4/homework/main.c diff --git a/task4/homework/integral.h b/task4/homework/integral.h new file mode 100644 index 0000000..bc6e433 --- /dev/null +++ b/task4/homework/integral.h @@ -0,0 +1,17 @@ +#ifndef INTEGRAL_H +#define INTEGRAL_H + +#include +#include +#include + +#define YMAX 225 +#define XMAX 15 +#define STEPSCALE 0.1 +#define EPS 0.000001 + +double func(double x); + +void calculate(double(*func)(double), int xmax, int ymax); + +#endif \ No newline at end of file diff --git a/task4/homework/main.c b/task4/homework/main.c new file mode 100644 index 0000000..b0192eb --- /dev/null +++ b/task4/homework/main.c @@ -0,0 +1,50 @@ +#include "integral.h" + +#define $ fprintf(stderr, "HERE %d\n", __LINE__); + +// y = x^2 + +int P = 0; + +double func(double x) +{ + return x*x; +} + +short isEqual(double x, double y) +{ + if (abs(x-y) < EPS) return 1; + + return 0; +} + +void calculate(double(*func)(double), int xmax, int ymax) +{ + double xStep = xmax * STEPSCALE; + double yStep = ymax * STEPSCALE; + double curX = 0; + double curY = 0; + + while ((int)(curY) != ymax) + { + while((int)(curX) != xmax) + { + curX += xStep; + } + + curY += yStep; + } +} + + +int main() +{ + double tmp = 1.43; + double tmp1 = 2.00; + + // printf("trunc: %d and %d\n", (int)trunc(tmp), (int)trunc(tmp1)); + printf("round: %d and %d\n", (int)tmp, (int)tmp1); + calculate(func, XMAX, YMAX); + + return 0; +} \ No newline at end of file From b4329bccedd856e884e32e43c3decf9020d8af9c Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Thu, 27 Oct 2022 09:35:27 -0700 Subject: [PATCH 29/40] refactoring --- task4/homework/integral.h | 38 +++++++++++++-- task4/homework/main.c | 100 +++++++++++++++++++++++++++++++------- task4/homework/makefile | 4 ++ 3 files changed, 121 insertions(+), 21 deletions(-) create mode 100644 task4/homework/makefile diff --git a/task4/homework/integral.h b/task4/homework/integral.h index bc6e433..7ba2a37 100644 --- a/task4/homework/integral.h +++ b/task4/homework/integral.h @@ -4,14 +4,46 @@ #include #include #include +#include + +#define PTHREAD_MAX 100 +#define NPOINTS 100000 #define YMAX 225 #define XMAX 15 -#define STEPSCALE 0.1 +#define YMIN 0 +#define XMIN 0 + #define EPS 0.000001 +//----------------------------------------- +struct PthreadData +{ + double xmin; + double ymin; + + double xmax; + double ymax; + + double(*func)(double); +}; + + +pthread_mutex_t mutex; + +static int P = 0; + +//------------------------------------------ + + +int integralMonteCarlo(int xmax, int ymax, int xmin, int ymin, int count, double(*func)(double)); + +short isEqual(double x, double y); + +void calculate(double(*func)(double), int xmax, int ymax, int xmin, int ymin); + +void* pthreadCalcStep(void* data); -double func(double x); +void printAnswer(double square, int xmax, int xmin); -void calculate(double(*func)(double), int xmax, int ymax); #endif \ No newline at end of file diff --git a/task4/homework/main.c b/task4/homework/main.c index b0192eb..3aaee6c 100644 --- a/task4/homework/main.c +++ b/task4/homework/main.c @@ -2,9 +2,9 @@ #define $ fprintf(stderr, "HERE %d\n", __LINE__); -// y = x^2 -int P = 0; +extern int P; +// y = x^2 double func(double x) { @@ -18,33 +18,97 @@ short isEqual(double x, double y) return 0; } -void calculate(double(*func)(double), int xmax, int ymax) +int integralMonteCarlo(int xmax, int ymax, int xmin, int ymin, int count, double(*func)(double)) { - double xStep = xmax * STEPSCALE; - double yStep = ymax * STEPSCALE; - double curX = 0; - double curY = 0; + unsigned int seed = time(NULL); - while ((int)(curY) != ymax) + double x = 0, y = 0; + int points = 0; + + for (int i = 0; i < count; i++) { - while((int)(curX) != xmax) - { - curX += xStep; - } + x = xmin + (double)(rand_r(&seed) * (xmax - xmin)/(double)RAND_MAX); + y = ymin + (double)(rand_r(&seed) * (ymax - ymin)/(double)RAND_MAX); + + if ( y <= func(x)) points++; + } + return points; +} + +void* pthreadCalcStep(void* data) +{ + if (!data) + { + fprintf(stderr, "ERR:THREAD DATA HAS BEEN LOST\n"); + return NULL; + } + + struct PthreadData* integralData = (struct PthreadData*)data; + + double xmax = integralData->xmax; + double ymax = integralData->ymax; + double xmin = integralData->xmin; + double ymin = integralData->ymin; + + int points = integralMonteCarlo(xmax, ymax, xmin, ymin, NPOINTS/PTHREAD_MAX, integralData->func); + + pthread_mutex_lock(&mutex); + + P += points; + pthread_mutex_unlock(&mutex); +} + +void calculate(double(*func)(double), int xmax, int ymax, int xmin, int ymin) +{ + pthread_mutex_init(&mutex, NULL); + + double stepScale = (1.0/PTHREAD_MAX); + double square = (xmax-xmin) * (ymax - ymin); + double xStep = (xmax-xmin) * stepScale; + double yStep = (ymax-ymin) * stepScale; + double curX = 0; + double curY = 0; + + struct PthreadData integralData[PTHREAD_MAX]; + + pthread_t tid[PTHREAD_MAX]; + + for (int i = 0; i < PTHREAD_MAX; i++) + { + integralData[i].xmin = curX; + integralData[i].ymin = curY; + curX += xStep; curY += yStep; + integralData[i].xmax = curX; + integralData[i].ymax = curY; + integralData[i].func = func; + + pthread_create(tid + i, NULL, pthreadCalcStep,(void*)(integralData + i)); + } + + for(int i = 0; i < PTHREAD_MAX; i++) + { + pthread_join(tid[i], NULL); } + pthread_mutex_destroy(&mutex); + + printAnswer(square, xmax, xmin); } +void printAnswer(double square, int xmax, int xmin) +{ + if (P == 0) + { + fprintf(stderr, "ERR: No selected points (P = 0)\n"); + return; + } + fprintf(stdout, "Integral from xmin = %d to xmax = %d\nValue:%lf\n", xmin, xmax, square*P/NPOINTS); +} int main() { - double tmp = 1.43; - double tmp1 = 2.00; - - // printf("trunc: %d and %d\n", (int)trunc(tmp), (int)trunc(tmp1)); - printf("round: %d and %d\n", (int)tmp, (int)tmp1); - calculate(func, XMAX, YMAX); + calculate(func, XMAX, YMAX, XMIN, YMIN); return 0; } \ No newline at end of file diff --git a/task4/homework/makefile b/task4/homework/makefile new file mode 100644 index 0000000..66f0f3f --- /dev/null +++ b/task4/homework/makefile @@ -0,0 +1,4 @@ +all: + gcc main.c -o a.out -lm -pthread +clean: + rm a.out \ No newline at end of file From 3488ae60d1b5974fc6a744a0c3069408c04f2a6f Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Thu, 27 Oct 2022 14:35:03 -0700 Subject: [PATCH 30/40] something intresting..... --- task4/homework/integral.h | 4 +- task4/homework/main.c | 81 +++++++++++++++++++++++++-------------- task4/homework/makefile | 2 +- 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/task4/homework/integral.h b/task4/homework/integral.h index 7ba2a37..6f03bad 100644 --- a/task4/homework/integral.h +++ b/task4/homework/integral.h @@ -7,7 +7,7 @@ #include -#define PTHREAD_MAX 100 +#define PTHREAD_SQR 2 #define NPOINTS 100000 #define YMAX 225 #define XMAX 15 @@ -35,7 +35,7 @@ static int P = 0; //------------------------------------------ -int integralMonteCarlo(int xmax, int ymax, int xmin, int ymin, int count, double(*func)(double)); +int integralMonteCarlo(double xmax,double ymax,double xmin,double ymin,int count,double(*func)(double)); short isEqual(double x, double y); diff --git a/task4/homework/main.c b/task4/homework/main.c index 3aaee6c..8baa96c 100644 --- a/task4/homework/main.c +++ b/task4/homework/main.c @@ -18,21 +18,23 @@ short isEqual(double x, double y) return 0; } -int integralMonteCarlo(int xmax, int ymax, int xmin, int ymin, int count, double(*func)(double)) +int integralMonteCarlo(double xmax, double ymax, double xmin, double ymin, int count, double(*func)(double)) { - unsigned int seed = time(NULL); + unsigned int id = time(NULL) + pthread_self(); + srand(id); double x = 0, y = 0; int points = 0; for (int i = 0; i < count; i++) { - - x = xmin + (double)(rand_r(&seed) * (xmax - xmin)/(double)RAND_MAX); - y = ymin + (double)(rand_r(&seed) * (ymax - ymin)/(double)RAND_MAX); - + x = (double)rand_r(&id) / RAND_MAX * (xmax - xmin) + xmin; + y = (double)rand_r(&id) / RAND_MAX * (ymax - ymin) + ymin; if ( y <= func(x)) points++; } + + printf("POINTS Integral %d\n", points); + printf("xmax:%lf xmin:%lf ymax:%lf ymin:%lf\n", xmax, xmin, ymax, ymin); return points; } @@ -51,11 +53,13 @@ void* pthreadCalcStep(void* data) double xmin = integralData->xmin; double ymin = integralData->ymin; - int points = integralMonteCarlo(xmax, ymax, xmin, ymin, NPOINTS/PTHREAD_MAX, integralData->func); - pthread_mutex_lock(&mutex); + + int points = integralMonteCarlo(xmax, ymax, xmin, ymin, NPOINTS/(PTHREAD_SQR * PTHREAD_SQR), integralData->func); + - P += points; + P += points; + pthread_mutex_unlock(&mutex); } @@ -63,31 +67,52 @@ void calculate(double(*func)(double), int xmax, int ymax, int xmin, int ymin) { pthread_mutex_init(&mutex, NULL); - double stepScale = (1.0/PTHREAD_MAX); - double square = (xmax-xmin) * (ymax - ymin); + double stepScale = (1.0/PTHREAD_SQR); + double square = (xmax-xmin) * (ymax-ymin); double xStep = (xmax-xmin) * stepScale; double yStep = (ymax-ymin) * stepScale; double curX = 0; double curY = 0; - struct PthreadData integralData[PTHREAD_MAX]; - - pthread_t tid[PTHREAD_MAX]; - - for (int i = 0; i < PTHREAD_MAX; i++) - { - integralData[i].xmin = curX; - integralData[i].ymin = curY; + struct PthreadData integralData[PTHREAD_SQR * PTHREAD_SQR]; + + pthread_t tid[PTHREAD_SQR * PTHREAD_SQR]; + $ + for (int i = 0; i < PTHREAD_SQR; i++) + { + curY = 0; + $ + for (int j = 0; j < PTHREAD_SQR; j++) + { + printf("pos:%d\n", i*PTHREAD_SQR + j); + integralData[i*PTHREAD_SQR + j].xmin = curX; + integralData[i*PTHREAD_SQR + j].ymin = curY; + integralData[i*PTHREAD_SQR + j].xmax = curX + xStep; + curY += yStep; + integralData[i*PTHREAD_SQR + j].ymax = curY; + $ + pthread_create(tid + i*PTHREAD_SQR + j, NULL, pthreadCalcStep, (void*)(integralData + i*PTHREAD_SQR + j)); + $ + } curX += xStep; - curY += yStep; - integralData[i].xmax = curX; - integralData[i].ymax = curY; - integralData[i].func = func; - - pthread_create(tid + i, NULL, pthreadCalcStep,(void*)(integralData + i)); } - - for(int i = 0; i < PTHREAD_MAX; i++) + $ + + // for (int i = 0; i < (PTHREAD_SQR * PTHREAD_SQR); i++) + // { + // integralData[i].xmin = curX; + // integralData[i].ymin = curY; + // curX += xStep; + // curY += yStep; + // integralData[i].xmax = curX; + // integralData[i].ymax = curY; + // integralData[i].func = func; + + + // pthread_create(tid + i, NULL, pthreadCalcStep,(void*)(integralData + i)); + // } + + for(int i = 0; i < (PTHREAD_SQR * PTHREAD_SQR); i++) { pthread_join(tid[i], NULL); } @@ -103,7 +128,7 @@ void printAnswer(double square, int xmax, int xmin) fprintf(stderr, "ERR: No selected points (P = 0)\n"); return; } - fprintf(stdout, "Integral from xmin = %d to xmax = %d\nValue:%lf\n", xmin, xmax, square*P/NPOINTS); + fprintf(stdout, "Integral from xmin = %d to xmax = %d\nValue:%lf\n", xmin, xmax, (square*P)/NPOINTS); } int main() diff --git a/task4/homework/makefile b/task4/homework/makefile index 66f0f3f..3c0bbab 100644 --- a/task4/homework/makefile +++ b/task4/homework/makefile @@ -1,4 +1,4 @@ all: - gcc main.c -o a.out -lm -pthread + gcc main.c -o a.out -lm -pthread -fsanitize=address clean: rm a.out \ No newline at end of file From 90a8845738adf2067055cc860db04d42e5e32ced Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Thu, 27 Oct 2022 15:48:43 -0700 Subject: [PATCH 31/40] completed task, TODO graph --- task4/homework/integral.h | 8 ++++---- task4/homework/main.c | 43 +++++++++++---------------------------- task4/homework/makefile | 3 ++- 3 files changed, 18 insertions(+), 36 deletions(-) diff --git a/task4/homework/integral.h b/task4/homework/integral.h index 6f03bad..de73e10 100644 --- a/task4/homework/integral.h +++ b/task4/homework/integral.h @@ -8,11 +8,11 @@ #define PTHREAD_SQR 2 -#define NPOINTS 100000 -#define YMAX 225 -#define XMAX 15 +#define NPOINTS 100000000 +#define YMAX 8886110 +#define XMAX 4 #define YMIN 0 -#define XMIN 0 +#define XMIN -1 #define EPS 0.000001 //----------------------------------------- diff --git a/task4/homework/main.c b/task4/homework/main.c index 8baa96c..c1042c8 100644 --- a/task4/homework/main.c +++ b/task4/homework/main.c @@ -4,11 +4,10 @@ extern int P; -// y = x^2 double func(double x) { - return x*x; + return exp(x*x); } short isEqual(double x, double y) @@ -33,8 +32,6 @@ int integralMonteCarlo(double xmax, double ymax, double xmin, double ymin, int c if ( y <= func(x)) points++; } - printf("POINTS Integral %d\n", points); - printf("xmax:%lf xmin:%lf ymax:%lf ymin:%lf\n", xmax, xmin, ymax, ymin); return points; } @@ -53,11 +50,10 @@ void* pthreadCalcStep(void* data) double xmin = integralData->xmin; double ymin = integralData->ymin; - pthread_mutex_lock(&mutex); - int points = integralMonteCarlo(xmax, ymax, xmin, ymin, NPOINTS/(PTHREAD_SQR * PTHREAD_SQR), integralData->func); - + pthread_mutex_lock(&mutex); + P += points; pthread_mutex_unlock(&mutex); @@ -71,46 +67,29 @@ void calculate(double(*func)(double), int xmax, int ymax, int xmin, int ymin) double square = (xmax-xmin) * (ymax-ymin); double xStep = (xmax-xmin) * stepScale; double yStep = (ymax-ymin) * stepScale; - double curX = 0; - double curY = 0; + double curX = xmin; + double curY = ymin; struct PthreadData integralData[PTHREAD_SQR * PTHREAD_SQR]; - pthread_t tid[PTHREAD_SQR * PTHREAD_SQR]; - $ + pthread_t tid[PTHREAD_SQR * PTHREAD_SQR]; + for (int i = 0; i < PTHREAD_SQR; i++) { curY = 0; - $ for (int j = 0; j < PTHREAD_SQR; j++) { - printf("pos:%d\n", i*PTHREAD_SQR + j); integralData[i*PTHREAD_SQR + j].xmin = curX; integralData[i*PTHREAD_SQR + j].ymin = curY; integralData[i*PTHREAD_SQR + j].xmax = curX + xStep; curY += yStep; integralData[i*PTHREAD_SQR + j].ymax = curY; - $ + integralData[i*PTHREAD_SQR + j].func = func; pthread_create(tid + i*PTHREAD_SQR + j, NULL, pthreadCalcStep, (void*)(integralData + i*PTHREAD_SQR + j)); - $ } curX += xStep; } - $ - - // for (int i = 0; i < (PTHREAD_SQR * PTHREAD_SQR); i++) - // { - // integralData[i].xmin = curX; - // integralData[i].ymin = curY; - // curX += xStep; - // curY += yStep; - // integralData[i].xmax = curX; - // integralData[i].ymax = curY; - // integralData[i].func = func; - - - // pthread_create(tid + i, NULL, pthreadCalcStep,(void*)(integralData + i)); - // } + for(int i = 0; i < (PTHREAD_SQR * PTHREAD_SQR); i++) { @@ -136,4 +115,6 @@ int main() calculate(func, XMAX, YMAX, XMIN, YMIN); return 0; -} \ No newline at end of file +} + +// pthread 1 = 2,301s pthread 4 = 0,609s pthread 2 = 1,139s pthread 3 = 0,980s pthread 9 = 0,610 etc \ No newline at end of file diff --git a/task4/homework/makefile b/task4/homework/makefile index 3c0bbab..a6fafeb 100644 --- a/task4/homework/makefile +++ b/task4/homework/makefile @@ -1,4 +1,5 @@ all: - gcc main.c -o a.out -lm -pthread -fsanitize=address + gcc main.c -o a.out -lm -pthread -fsanitize=address -O0 + clean: rm a.out \ No newline at end of file From 5e6bdd327ea62dce7419c222295673da6bff7669 Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Sun, 30 Oct 2022 14:48:14 -0700 Subject: [PATCH 32/40] cosmetic --- task4/homework/integral.h | 4 ++-- task4/homework/main.c | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/task4/homework/integral.h b/task4/homework/integral.h index de73e10..ad304b0 100644 --- a/task4/homework/integral.h +++ b/task4/homework/integral.h @@ -7,7 +7,7 @@ #include -#define PTHREAD_SQR 2 +#define PTHREAD_SQRT 2 #define NPOINTS 100000000 #define YMAX 8886110 #define XMAX 4 @@ -46,4 +46,4 @@ void* pthreadCalcStep(void* data); void printAnswer(double square, int xmax, int xmin); -#endif \ No newline at end of file +#endif diff --git a/task4/homework/main.c b/task4/homework/main.c index c1042c8..a62f875 100644 --- a/task4/homework/main.c +++ b/task4/homework/main.c @@ -50,7 +50,7 @@ void* pthreadCalcStep(void* data) double xmin = integralData->xmin; double ymin = integralData->ymin; - int points = integralMonteCarlo(xmax, ymax, xmin, ymin, NPOINTS/(PTHREAD_SQR * PTHREAD_SQR), integralData->func); + int points = integralMonteCarlo(xmax, ymax, xmin, ymin, NPOINTS/(PTHREAD_SQRT * PTHREAD_SQRT), integralData->func); pthread_mutex_lock(&mutex); @@ -63,35 +63,35 @@ void calculate(double(*func)(double), int xmax, int ymax, int xmin, int ymin) { pthread_mutex_init(&mutex, NULL); - double stepScale = (1.0/PTHREAD_SQR); + double stepScale = (1.0/PTHREAD_SQRT); double square = (xmax-xmin) * (ymax-ymin); double xStep = (xmax-xmin) * stepScale; double yStep = (ymax-ymin) * stepScale; double curX = xmin; double curY = ymin; - struct PthreadData integralData[PTHREAD_SQR * PTHREAD_SQR]; + struct PthreadData integralData[PTHREAD_SQRT * PTHREAD_SQRT]; - pthread_t tid[PTHREAD_SQR * PTHREAD_SQR]; + pthread_t tid[PTHREAD_SQRT * PTHREAD_SQRT]; - for (int i = 0; i < PTHREAD_SQR; i++) + for (int i = 0; i < PTHREAD_SQRT; i++) { curY = 0; - for (int j = 0; j < PTHREAD_SQR; j++) + for (int j = 0; j < PTHREAD_SQRT; j++) { - integralData[i*PTHREAD_SQR + j].xmin = curX; - integralData[i*PTHREAD_SQR + j].ymin = curY; - integralData[i*PTHREAD_SQR + j].xmax = curX + xStep; + integralData[i*PTHREAD_SQRT + j].xmin = curX; + integralData[i*PTHREAD_SQRT + j].ymin = curY; + integralData[i*PTHREAD_SQRT + j].xmax = curX + xStep; curY += yStep; - integralData[i*PTHREAD_SQR + j].ymax = curY; - integralData[i*PTHREAD_SQR + j].func = func; - pthread_create(tid + i*PTHREAD_SQR + j, NULL, pthreadCalcStep, (void*)(integralData + i*PTHREAD_SQR + j)); + integralData[i*PTHREAD_SQRT + j].ymax = curY; + integralData[i*PTHREAD_SQRT + j].func = func; + pthread_create(tid + i*PTHREAD_SQRT + j, NULL, pthreadCalcStep, (void*)(integralData + i*PTHREAD_SQRT + j)); } curX += xStep; } - for(int i = 0; i < (PTHREAD_SQR * PTHREAD_SQR); i++) + for(int i = 0; i < (PTHREAD_SQRT * PTHREAD_SQRT); i++) { pthread_join(tid[i], NULL); } @@ -117,4 +117,4 @@ int main() return 0; } -// pthread 1 = 2,301s pthread 4 = 0,609s pthread 2 = 1,139s pthread 3 = 0,980s pthread 9 = 0,610 etc \ No newline at end of file +// pthread 1 = 2,301s pthread 4 = 0,609s pthread 2 = 1,139s pthread 3 = 0,980s pthread 9 = 0,610 etc From b509fd99f2a35bcb0edac3a315f855b4258ac0e2 Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Sun, 30 Oct 2022 15:00:43 -0700 Subject: [PATCH 33/40] cosmetic#2 --- task4/homework/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task4/homework/main.c b/task4/homework/main.c index a62f875..1434f95 100644 --- a/task4/homework/main.c +++ b/task4/homework/main.c @@ -76,7 +76,7 @@ void calculate(double(*func)(double), int xmax, int ymax, int xmin, int ymin) for (int i = 0; i < PTHREAD_SQRT; i++) { - curY = 0; + curY = ymin; for (int j = 0; j < PTHREAD_SQRT; j++) { integralData[i*PTHREAD_SQRT + j].xmin = curX; From 3a2b5c70ed93bd50d03ee0063e99082c6863853f Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Mon, 31 Oct 2022 12:35:29 -0700 Subject: [PATCH 34/40] Add files via upload --- task4/homework/TimeThreads.png | Bin 0 -> 31477 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 task4/homework/TimeThreads.png diff --git a/task4/homework/TimeThreads.png b/task4/homework/TimeThreads.png new file mode 100644 index 0000000000000000000000000000000000000000..c0069d38f6c1a80b223b07db7ab0ff9339c28c92 GIT binary patch literal 31477 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 literal 0 HcmV?d00001 From 1a55d4b5b19b11c0f36f999e49acc0ad9758456d Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Mon, 31 Oct 2022 22:36:38 +0300 Subject: [PATCH 35/40] Create README.md --- task4/homework/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 task4/homework/README.md diff --git a/task4/homework/README.md b/task4/homework/README.md new file mode 100644 index 0000000..29177a5 --- /dev/null +++ b/task4/homework/README.md @@ -0,0 +1 @@ +[!Img alt](https://github.com/shaazmik/3_sem_22_23/blob/main/task4/homework/TimeThreads.png?raw=true) From 0e973186318711be1676364b3ac47cb116665f51 Mon Sep 17 00:00:00 2001 From: Daniil <45428240+shaazmik@users.noreply.github.com> Date: Mon, 31 Oct 2022 22:37:52 +0300 Subject: [PATCH 36/40] Update README.md --- task4/homework/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task4/homework/README.md b/task4/homework/README.md index 29177a5..ec62c55 100644 --- a/task4/homework/README.md +++ b/task4/homework/README.md @@ -1 +1 @@ -[!Img alt](https://github.com/shaazmik/3_sem_22_23/blob/main/task4/homework/TimeThreads.png?raw=true) +![Img alt](https://github.com/shaazmik/3_sem_22_23/blob/main/task4/homework/TimeThreads.png) From 3786f9eb94397ab789622ead2a27b6e3ddb24978 Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Tue, 29 Nov 2022 15:19:37 -0800 Subject: [PATCH 37/40] added 5 --- task5/homework/log.txt | 26 ++++++ task5/homework/main.c | 202 +++++++++++++++++++++++++++++++++++++++++ task5/homework/out.txt | 4 + 3 files changed, 232 insertions(+) create mode 100644 task5/homework/log.txt create mode 100644 task5/homework/main.c create mode 100644 task5/homework/out.txt diff --git a/task5/homework/log.txt b/task5/homework/log.txt new file mode 100644 index 0000000..b4d885f --- /dev/null +++ b/task5/homework/log.txt @@ -0,0 +1,26 @@ +MESSAGE WAS WRITTEN, MSG:"swdawudawuduawduajsdlawldkawhldawhd hllajwdhlawdhlawhldlawdjlawdhawhd" +child work is done +MESSAGE WAS WRITTEN, MSG:"wdawdawjdawjawjhd hj" +child work is done +MESSAGE WAS WRITTEN, MSG:"wajdjawjdawjdjawdjkadkjaldawhdalhwkd" +child work is done +parent work is done +parent work is done +message was read +message was read +MESSAGE WAS WRITTEN, MSG:"asduawudwaudhawjddkjawkdjawkdhawdhawkhd" +message was read +MESSAGE WAS WRITTEN, MSG:"daw awd" +message was read +MESSAGE WAS WRITTEN, MSG:"awdhawdjawdjawdawjd" +message was read +parent work is done +child work is done +MESSAGE WAS WRITTEN, MSG:"dajwdjawjdajwdjawjdawjdjawdjawjdjawdjkjdkawhkdhawdkhawhdkawdhawkkjawdkjadw" +message was read +MESSAGE WAS WRITTEN, MSG:"wwwadawda" +message was read +MESSAGE WAS WRITTEN, MSG:"ajwdjwajdjawjdawjdjawdjawj jawdjawjdawjdkawjdkjawdjkwajkdjawkd\" +message was read +MESSAGE WAS WRITTEN, MSG:"awdkawkdkawdkawdkkawd" +message was read diff --git a/task5/homework/main.c b/task5/homework/main.c new file mode 100644 index 0000000..43f1abd --- /dev/null +++ b/task5/homework/main.c @@ -0,0 +1,202 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum MY_SIG +{ + WRITE_SIG = 45, + READ_SIG = 46, + END_SIG = 2 +}; + +enum BOOL_STATUS +{ + WRITE_BOOL = 1, + READ_BOOL = 2, + END_WR_BOOL = 3, + END_RD_BOOL = 4 +}; + +short parent_flag = 1; +short child_flag = 0; +short parent_flag_end = 0; +short child_flag_end = 0; + +const char* name = "HESOYAM"; + +#define SIZE 20480 + +void parent_sigHandler(int signo, siginfo_t* siginf, void* context) +{ + parent_flag = WRITE_BOOL; +} + +void parent_terminationHandler(int signo, siginfo_t* siginf, void* context) +{ + parent_flag_end = END_WR_BOOL; +} + +void child_sigHandler(int signo, siginfo_t* siginf, void* context) +{ + child_flag = READ_BOOL; + FILE* output = fopen("out.txt", "a"); + + fprintf(output, "%s\n", (char*)siginf->si_value.sival_ptr ); + fclose(output); + + FILE* log = fopen("log.txt", "a" ); + fprintf(log, "message was read\n" ); + fclose(log); + + return; +} + +void child_terminationHandler(int signo, siginfo_t* siginf, void* context) +{ + child_flag_end = END_RD_BOOL; +} + + +int main(int argc, const char* argv[]) +{ + int shm_fd = -1; + + void* ptr = NULL; + + shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); + + ftruncate(shm_fd, SIZE); + + ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); + + if(ptr == MAP_FAILED) + { + perror("mmap"); + exit(1); + } + + pid_t parent_pid = getpid(); + pid_t child_pid = fork(); + + if (child_pid == -1) + { + perror("fork:"); + exit(1); + } + + if (child_pid > 0) + { + size_t size = 0; + + sigset_t mask; + + sigemptyset(&mask); + sigaddset(&mask, WRITE_SIG); + sigaddset(&mask, END_SIG); + + struct sigaction sa_write, sa_end; + + sa_end.sa_sigaction = parent_terminationHandler; + sa_end.sa_mask = mask; + sa_end.sa_flags = SA_SIGINFO; + sa_write.sa_sigaction = parent_sigHandler; + sa_write.sa_mask = mask; + sa_write.sa_flags = SA_SIGINFO; + + union sigval val; + + sigaction(END_SIG, &sa_end, NULL); + sigaction(WRITE_SIG, &sa_write, NULL); + + FILE* log = NULL; + + while (1) { + + if (parent_flag == WRITE_BOOL) { + + if ( scanf( "%[^\n]", (char*)(ptr + size) ) == 1 ){ + + while( getchar() != '\n' ); + val.sival_ptr = ptr + size; + parent_flag = 0; + log = fopen("log.txt", "a" ); + fprintf(log, "MESSAGE WAS WRITTEN, MSG:\"%s\"\n", (char*)(ptr + size)); + fclose(log); + size += strlen( (char*)(ptr + size) ); + if ( size >= SIZE ) size = 0; + sigqueue( child_pid, READ_SIG, val); + } + + } + + if ( parent_flag_end == END_WR_BOOL ) + { + log = fopen("log.txt", "a" ); + fprintf( log, "parent work is done\n"); + fclose( log ); + child_flag_end = END_RD_BOOL; + parent_flag_end = 0; + parent_flag = 0; + int status = 0; + waitpid(child_pid, &status, 0); + kill(child_pid, END_SIG); + return 0; + } + } + } + else + { + close(0); + close(1); + close(2); + FILE* log = NULL; + + sigset_t mask; + sigemptyset( &mask ); + sigaddset( &mask, END_SIG ); + sigaddset( &mask, READ_SIG ); + + struct sigaction sa_end, sa_read; + + sa_end.sa_sigaction = child_terminationHandler; + sa_end.sa_mask = mask; + sa_end.sa_flags = SA_SIGINFO; + sa_read.sa_sigaction = child_sigHandler; + sa_read.sa_mask = mask; + sa_read.sa_flags = SA_SIGINFO; + + sigaction(END_SIG, &sa_end, NULL); + sigaction(READ_SIG, &sa_read, NULL); + + while(1) + { + + if (child_flag == READ_BOOL) { + + child_flag = 0; + kill( parent_pid, WRITE_SIG); + } + + if ( child_flag_end == END_RD_BOOL ) + { + + log = fopen("log.txt", "a" ); + fprintf(log, "child work is done\n"); + fclose(log); + shm_unlink(name); + munmap(ptr, SIZE); + kill(parent_pid, SIGCHLD); + return 0; + } + } + } + + return 0; +} \ No newline at end of file diff --git a/task5/homework/out.txt b/task5/homework/out.txt new file mode 100644 index 0000000..5e15764 --- /dev/null +++ b/task5/homework/out.txt @@ -0,0 +1,4 @@ +dajwdjawjdajwdjawjdawjdjawdjawjdjawdjkjdkawhkdhawdkhawhdkawdhawkkjawdkjadw +wwwadawda +ajwdjwajdjawjdawjdjawdjawj jawdjawjdawjdkawjdkjawdjkwajkdjawkd\ +awdkawkdkawdkawdkkawd From 7cfb6bc4bd6daf72128c2665fc8697d3863f5a16 Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Sat, 3 Dec 2022 11:49:25 -0800 Subject: [PATCH 38/40] get args func --- task4/homework/integral.h | 2 +- task4/homework/main.c | 1 + task6/homework/daemon.h | 19 +++++++++++++++ task6/homework/log.c | 27 +++++++++++++++++++++ task6/homework/log.h | 18 ++++++++++++++ task6/homework/log.txt | 0 task6/homework/main.c | 14 +++++++++++ task6/homework/makefile | 2 ++ task6/homework/parser.c | 51 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 task6/homework/daemon.h create mode 100644 task6/homework/log.c create mode 100644 task6/homework/log.h create mode 100644 task6/homework/log.txt create mode 100644 task6/homework/main.c create mode 100644 task6/homework/makefile create mode 100644 task6/homework/parser.c diff --git a/task4/homework/integral.h b/task4/homework/integral.h index ad304b0..62fdf17 100644 --- a/task4/homework/integral.h +++ b/task4/homework/integral.h @@ -7,7 +7,7 @@ #include -#define PTHREAD_SQRT 2 +#define PTHREAD_SQRT 4 #define NPOINTS 100000000 #define YMAX 8886110 #define XMAX 4 diff --git a/task4/homework/main.c b/task4/homework/main.c index 1434f95..f514310 100644 --- a/task4/homework/main.c +++ b/task4/homework/main.c @@ -2,6 +2,7 @@ #define $ fprintf(stderr, "HERE %d\n", __LINE__); +#include extern int P; diff --git a/task6/homework/daemon.h b/task6/homework/daemon.h new file mode 100644 index 0000000..92f6f28 --- /dev/null +++ b/task6/homework/daemon.h @@ -0,0 +1,19 @@ +#ifndef DAEMON_H +#define DAEMON_H + +#include +#include +#include +#include +#include "log.h" + +enum Mods getCMDargs(int argc, char* argv[], pid_t* pid); + + +enum Mods +{ + BASH = 0, + DAEMON = 1, +}; + +#endif \ No newline at end of file diff --git a/task6/homework/log.c b/task6/homework/log.c new file mode 100644 index 0000000..55785c8 --- /dev/null +++ b/task6/homework/log.c @@ -0,0 +1,27 @@ +#include "log.h" + +FILE* log; + +void closeLog() +{ + fclose(log); +} + +void startLogging() +{ + log = fopen("log.txt", "w"); + + atexit(closeLog); +} + +void showExample() +{ + fprintf(stdout, "Program example:\n" + "MODS: -b [BASH MOD], -d [DAEMON MOD]\n" + "\'name.out -b 5\'\n" + "BASH MOD WITH PID = 5\n" + "\'name.out -d 13\'\n" + "DAEMON MOD WITH PID = 13\n" + "\'name.out 19\'\n" + "BASH MOD [BY DEFAULTS] WITH PID = 19\n"); +} \ No newline at end of file diff --git a/task6/homework/log.h b/task6/homework/log.h new file mode 100644 index 0000000..ded210c --- /dev/null +++ b/task6/homework/log.h @@ -0,0 +1,18 @@ +#ifndef LOG_H +#define LOG_H + +#include +#include + +#define $ fprintf(stderr, "LINE %d\n", __LINE__); + +void closeLog(); + +void startLogging(); + +void showExample(); + + +#define EXIT_ERROR -1337 + +#endif \ No newline at end of file diff --git a/task6/homework/log.txt b/task6/homework/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/task6/homework/main.c b/task6/homework/main.c new file mode 100644 index 0000000..a20dcc7 --- /dev/null +++ b/task6/homework/main.c @@ -0,0 +1,14 @@ +#include "daemon.h" +#include "log.h" + + +int main(int argc, char* argv[]) +{ + startLogging(); + + pid_t pid = 0; + + int mod = getCMDargs(argc, argv, &pid); + + +} \ No newline at end of file diff --git a/task6/homework/makefile b/task6/homework/makefile new file mode 100644 index 0000000..0839122 --- /dev/null +++ b/task6/homework/makefile @@ -0,0 +1,2 @@ +all: + gcc main.c log.c parser.c -o daemon.out -ggdb3 -O0 -Wall -Wextra -Waggressive-loop-optimizations -Wmissing-declarations -Wcast-align -Wcast-qual -Wchar-subscripts -Wconversion -Wempty-body -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr \ No newline at end of file diff --git a/task6/homework/parser.c b/task6/homework/parser.c new file mode 100644 index 0000000..ced3e98 --- /dev/null +++ b/task6/homework/parser.c @@ -0,0 +1,51 @@ +#include "daemon.h" + +enum Mods getCMDargs(int argc, char* argv[], pid_t* pid) +{ + int mod = BASH; + + switch (argc) + { + case 3: + if (!strcmp(argv[1], "-b")) + { + mod = BASH; + } + else if(!strcmp(argv[1], "-d")) + { + mod = DAEMON; + } + else + { + fprintf(stderr, "Wrong Mod:\n\n"); + showExample(); + exit(EXIT_ERROR); + } + + *pid = atoi(argv[2]); + if (*pid == 0) + { + fprintf(stderr, "Wrong PID:\n\n"); + showExample(); + exit(EXIT_ERROR); + } + return mod; + break; + + case 2: + *pid = atoi(argv[1]); + if (*pid == 0) + { + fprintf(stderr, "Wrong PID:\n\n"); + showExample(); + exit(EXIT_ERROR); + } + break; + + default: + fprintf(stderr, "Wrong arguments:\n\n"); + showExample(); + exit(1); + break; + } +} \ No newline at end of file From 7feb4bce3ff786e9d0abad6c652e6873667bc9f7 Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Mon, 5 Dec 2022 07:48:48 -0800 Subject: [PATCH 39/40] task6 smth went wrong.... --- task6/homework/bashDiff.sh | 15 ++++ task6/homework/daemon.h | 49 ++++++++++++ task6/homework/interface.c | 103 ++++++++++++++++++++++++ task6/homework/log.c | 15 +++- task6/homework/log.h | 15 ++++ task6/homework/log.txt | 65 ++++++++++++++++ task6/homework/main.c | 76 +++++++++++++++++- task6/homework/makefile | 10 ++- task6/homework/parser.c | 143 ++++++++++++++++++++++++++++++++++ task6/homework/polling.c | 106 +++++++++++++++++++++++++ task6/homework/saveSamples.sh | 16 ++++ 11 files changed, 609 insertions(+), 4 deletions(-) create mode 100644 task6/homework/bashDiff.sh create mode 100644 task6/homework/interface.c create mode 100644 task6/homework/polling.c create mode 100644 task6/homework/saveSamples.sh diff --git a/task6/homework/bashDiff.sh b/task6/homework/bashDiff.sh new file mode 100644 index 0000000..545bc8b --- /dev/null +++ b/task6/homework/bashDiff.sh @@ -0,0 +1,15 @@ +#! /bin/bash + +printf '\n%90s\n' | tr ' ' = >> $2 +printf '\n%90s\n' | tr ' ' ? >> $2 +printf '\n%90s\n\n' | tr ' ' = >> $2 + +for sample_name in `ls ./SampleData | sort -r -d | head -$1` +do + cat ./SampleData/$sample_name >> $2 + echo "" >> $2 +done + +printf '\n%90s\n' | tr ' ' = >> $2 +printf '\n%90s\n' | tr ' ' ! >> $2 +printf '\n%90s\n\n' | tr ' ' = >> $2 \ No newline at end of file diff --git a/task6/homework/daemon.h b/task6/homework/daemon.h index 92f6f28..a843c8e 100644 --- a/task6/homework/daemon.h +++ b/task6/homework/daemon.h @@ -3,17 +3,66 @@ #include #include +#include #include +#include +#include +#include #include +#include +#include #include "log.h" +#include + +#define _GNU_SOURCE + enum Mods getCMDargs(int argc, char* argv[], pid_t* pid); +char* getCurDir(pid_t pid, char* curDir); +int saveDirData(const char* curDir); +int cp(const char *to, const char *from); +int createDir(const char* dir_name); + + +void registerSignals(); +FILE* prepareInterface(); +int fifo_init(); +int getCmdFromBuff(const char* cmd_buffer, int* arg); +int getInterface(int fifo_fd, int* arg); + +int pollSamples(int inotify_fd, const char* work_dir); +void create_diff (const char* observed_file_path, const char* file_name); +int is_text_file(const char* file); +void create_sample(); +void getTimestamp(char* timestamp); + +#define PATH_MAX_SIZE 255 +#define CMD_SIZE 4096 +#define NOTIFY_SIZE (10 * (sizeof(struct inotify_event) + NAME_MAX + 1)) +#define STAMP_SIZE 255 + + +#define DAEMON_DIR "./DaemonData" +#define DAEMON_CMD "DaemonCmd.txt" +#define DIFF_DIR "./DaemonDiff" +#define FIFO_DIR "./tmp/LogDaemon.fifo" +#define SAMPLE_DATA_DIR "./SampleData" + enum Mods { BASH = 0, DAEMON = 1, }; +enum Interface +{ + PRINTLOGS = 1336, + KILL_DAEMON = 1337, + NO_CMD = 1338, + PERIOD = 1339, + ERROR = 1400, +}; + #endif \ No newline at end of file diff --git a/task6/homework/interface.c b/task6/homework/interface.c new file mode 100644 index 0000000..3851c9c --- /dev/null +++ b/task6/homework/interface.c @@ -0,0 +1,103 @@ +#include "daemon.h" + +void signalHnd() +{ + fprintf(stdout, "Can't sent signal to proccess pid:%d\n", getpid()); + LOG("Trying send signal\n"); +} + +void registerSignals() +{ + signal(SIGINT, signalHnd); + signal(SIGQUIT, signalHnd); + signal(SIGABRT, signalHnd); + signal(SIGTRAP, signalHnd); + signal(SIGTERM, signalHnd); + signal(SIGCONT, signalHnd); + signal(SIGTSTP, signalHnd); +} + +FILE* prepareInterface() +{ + registerSignals(); + + FILE* cmdFile = fopen(DAEMON_CMD, "w"); + + if (!cmdFile) + { + LOG("ERROR CMD FILE:"); + return NULL; + } + + mode_t old_umask = umask(0); + + createDir(DAEMON_DIR); + createDir(DIFF_DIR); + createDir(SAMPLE_DATA_DIR); + + return cmdFile; +} + + +int fifo_init() +{ + createDir("tmp"); + mkfifo(FIFO_DIR, 0666); + + int fifo_fd = -1; + fprintf(stdout, "Write something in FIFO to start DAEMON\n"); + + fifo_fd = open(FIFO_DIR, O_RDONLY); + fprintf(stdout, "fifo_fd: %d\n", fifo_fd); + + return fifo_fd; +} + +int getInterface(int fifo_fd, int* arg) +{ + char cmdBuffer[CMD_SIZE] = {}; + size_t readRet = 0; + + readRet = read(fifo_fd, cmdBuffer, CMD_SIZE); + + if (readRet == 0 || (readRet == -1 && errno == EAGAIN)) + return NO_CMD; + + int cmd = getCmdFromBuff(cmdBuffer, arg); + + return cmd; +} + +int getCmdFromBuff(const char* cmd_buffer, int* arg) +{ + char cmdStr[CMD_SIZE] = {}; + int ret_val = sscanf(cmd_buffer, "%s %d", cmdStr, arg); + + switch (ret_val) + { + case 2: + if (!strcmp(cmdStr, "setTime")) + { + return PERIOD; + } + if (!strcmp(cmdStr, "printLog")) + { + return PRINTLOGS; + } + return ERROR; + break; + + case 1: + if (!strcmp(cmdStr, "kill")) + return KILL_DAEMON; + else + return ERROR; + break; + + default: + LOG("CMD GETTING FROM BUFF ERROR"); + return NO_CMD; + } + + return ERROR; +} \ No newline at end of file diff --git a/task6/homework/log.c b/task6/homework/log.c index 55785c8..97ff590 100644 --- a/task6/homework/log.c +++ b/task6/homework/log.c @@ -1,6 +1,5 @@ #include "log.h" -FILE* log; void closeLog() { @@ -24,4 +23,16 @@ void showExample() "DAEMON MOD WITH PID = 13\n" "\'name.out 19\'\n" "BASH MOD [BY DEFAULTS] WITH PID = 19\n"); -} \ No newline at end of file +} + + +void logVar(const char* format, ...) +{ + va_list args; + va_start(args, format); + + vfprintf(log, format, args); + fputc('\n', log); + fflush(log); + va_end(args); +} \ No newline at end of file diff --git a/task6/homework/log.h b/task6/homework/log.h index ded210c..0bb71be 100644 --- a/task6/homework/log.h +++ b/task6/homework/log.h @@ -3,15 +3,30 @@ #include #include +#include + +FILE* log; #define $ fprintf(stderr, "LINE %d\n", __LINE__); +#define LOG_FUNC(function_name) fprintf(log, "CALLING FUNC: \'%s\' ON %d LINE\n", #function_name, __LINE__); \ + fprintf(stderr, "ERROR: check log.txt\n"); + + +#define LOG(msg) fprintf(log, "\nLOGGER_MSG\n" \ + "MSG: %s\n" \ + "FUNC:%s\n" , msg, __FUNCTION__); \ + + + void closeLog(); void startLogging(); void showExample(); +void logVar(const char* format, ...); + #define EXIT_ERROR -1337 diff --git a/task6/homework/log.txt b/task6/homework/log.txt index e69de29..b22c4e9 100644 --- a/task6/homework/log.txt +++ b/task6/homework/log.txt @@ -0,0 +1,65 @@ + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main +Set period:from 3 to 4 + + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main + +LOGGER_MSG +MSG: NO CMD + +FUNC:main + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main + +LOGGER_MSG +MSG: NO CMD + +FUNC:main + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main + +LOGGER_MSG +MSG: NO CMD + +FUNC:main + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main +Count of last logs: 1 + + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main + +LOGGER_MSG +MSG: NO CMD + +FUNC:main + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main + +LOGGER_MSG +MSG: NO CMD + +FUNC:main + +LOGGER_MSG +MSG: START SAMPLING +FUNC:main + +LOGGER_MSG +MSG: KILL DAEMON +FUNC:main diff --git a/task6/homework/main.c b/task6/homework/main.c index a20dcc7..f22a9e8 100644 --- a/task6/homework/main.c +++ b/task6/homework/main.c @@ -5,10 +5,84 @@ int main(int argc, char* argv[]) { startLogging(); - pid_t pid = 0; + FILE* cmdFile = prepareInterface(); int mod = getCMDargs(argc, argv, &pid); + fprintf(stdout, "Daemon pid: %d\n", getpid()); + + if (mod == DAEMON) + { + } + + char workDir[PATH_MAX_SIZE] = {}; + + if (!getCurDir(pid, workDir)) + { + LOG_FUNC(getCurDir); + return -1; + } + + saveDirData(workDir); + + int inotify_fd = 0; + inotify_fd = inotify_init(); + + fcntl(inotify_fd, F_SETFL, fcntl (inotify_fd, F_GETFL) | O_NONBLOCK); + + int fifo_fd = fifo_init(); + if (fifo_fd == -1) return -1; + + fcntl(fifo_fd, F_SETFL, fcntl (inotify_fd, F_GETFL) | O_NONBLOCK); + + inotify_add_watch(inotify_fd, workDir, IN_MODIFY); + + int T = 3; + char cmd_buffer[CMD_SIZE] = {}; + int DAEMON_HP = 1; + for (int i = 0; DAEMON_HP; i++, sleep(T)) + { + LOG("START SAMPLING"); + int arg = -1; + int cmd = getInterface(fifo_fd, &arg); + + switch (cmd) + { + case KILL_DAEMON: + LOG("KILL DAEMON"); + DAEMON_HP = 0; + break; + + case PERIOD: + logVar("Set period:from %d to %d\n", T, arg); + T = arg; + break; + + case PRINTLOGS: + logVar("Count of last logs: %d\n", arg); + sprintf(cmd_buffer, "bash bashDiff.sh %d %s", arg, DAEMON_CMD); + system(cmd_buffer); + break; + + case ERROR: + fprintf(stderr, "ERROR CHECK LOGS\n"); + LOG("ERROR"); + break; + + case NO_CMD: + fprintf(stderr,"NO CMD\n"); + LOG("NO CMD\n"); + break; + } + + pollSamples(inotify_fd, workDir); + system("bash saveSamples.sh -k1"); + } + + fclose(cmdFile); + close(fifo_fd); + + return 0; } \ No newline at end of file diff --git a/task6/homework/makefile b/task6/homework/makefile index 0839122..706d3a6 100644 --- a/task6/homework/makefile +++ b/task6/homework/makefile @@ -1,2 +1,10 @@ all: - gcc main.c log.c parser.c -o daemon.out -ggdb3 -O0 -Wall -Wextra -Waggressive-loop-optimizations -Wmissing-declarations -Wcast-align -Wcast-qual -Wchar-subscripts -Wconversion -Wempty-body -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr \ No newline at end of file + gcc main.c log.c parser.c interface.c polling.c -o daemon.out -ggdb3 -O0 -w -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr + +gg: + gcc main.c log.c parser.c interface.c polling.c -o daemon.out + +clean: + rm -rf DaemonData + rm -rf tmp + rm -rf DaemonDiff \ No newline at end of file diff --git a/task6/homework/parser.c b/task6/homework/parser.c index ced3e98..a754b6a 100644 --- a/task6/homework/parser.c +++ b/task6/homework/parser.c @@ -48,4 +48,147 @@ enum Mods getCMDargs(int argc, char* argv[], pid_t* pid) exit(1); break; } + + return BASH; +} + + +char* getCurDir(pid_t pid, char* curDir) +{ + char proc_dir_path[PATH_MAX_SIZE] = {}; + + sprintf(proc_dir_path, "/proc/%d/cwd", pid); + + if(readlink(proc_dir_path, curDir, PATH_MAX_SIZE) == -1) + { + perror("readlink:"); + LOG("readlink:"); + return NULL; + } + + return curDir; +} + +int cp(const char *to, const char *from) +{ + int fd_to, fd_from; + char buf[4096]; + ssize_t nread; + int saved_errno; + + fd_from = open(from, O_RDONLY); + if (fd_from < 0) + return -1; + + fd_to = open(to, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (fd_to < 0) + goto out_error; + + while (nread = read(fd_from, buf, sizeof buf), nread > 0) + { + char *out_ptr = buf; + ssize_t nwritten; + + do { + nwritten = write(fd_to, out_ptr, nread); + + if (nwritten >= 0) + { + nread -= nwritten; + out_ptr += nwritten; + } + else if (errno != EINTR) + { + goto out_error; + } + } while (nread > 0); + } + + if (nread == 0) + { + if (close(fd_to) < 0) + { + fd_to = -1; + goto out_error; + } + close(fd_from); + + return 0; + } + +out_error: + saved_errno = errno; + + close(fd_from); + if (fd_to >= 0) + close(fd_to); + + errno = saved_errno; + return -1; +} + +int createDir(const char* dir_name) +{ + mode_t old_umask = umask(0); + + int ret = mkdir(dir_name, 0777); + + if (ret == ERROR && errno != EEXIST) + { + perror("mkdir:"); + LOG("mkdir:"); + return ERROR; + } + + umask(old_umask); + + return ret; +} + +int saveDirData(const char* curDir) +{ + char* destPath[PATH_MAX_SIZE] = {}; + strcpy(destPath, DAEMON_DIR); + char* destDirEnd = strchr(destPath,'\0'); + *destDirEnd++ = '/'; + *destDirEnd = '\0'; + + char srcPath[PATH_MAX_SIZE] = {}; + strcpy(srcPath, curDir); + char* srcDirEnd = strchr(srcPath, '\0'); + *srcDirEnd++ = '/'; + *srcDirEnd = '\0'; + + DIR *dirp; + struct dirent* sdir; + + dirp = opendir(curDir); + + if (dirp == NULL) + { + LOG("opendir failed in PATH\n"); + return -1; + } + + for (;;) + { + sdir = readdir(dirp); + + if (sdir == NULL) + break; + + if (sdir->d_type != DT_REG) + continue; + + strcat(destPath, sdir->d_name); + strcat(srcPath, sdir->d_name); + cp(destPath, srcPath); + + *destDirEnd = '\0'; + *srcDirEnd = '\0'; + } + + closedir(dirp); + + return 0; } \ No newline at end of file diff --git a/task6/homework/polling.c b/task6/homework/polling.c new file mode 100644 index 0000000..c0a0485 --- /dev/null +++ b/task6/homework/polling.c @@ -0,0 +1,106 @@ +#include "daemon.h" + +int pollSamples(int inotify_fd, const char* work_dir) +{ + char buf[NOTIFY_SIZE] = {}; + errno = 0; + + int numRead = read(inotify_fd, buf, NOTIFY_SIZE); + + if (numRead == 0) + { + LOG("read() from inotify fd returned 0!"); + } + else if (numRead == ERROR && errno == EAGAIN) + { + LOG("No events happened"); + return 0; + } + else if (numRead == ERROR) + { + LOG("inotify read error"); + return ERROR; + } + + char* p = NULL; + short f_textChanged = 0; + for (p = buf; p < buf + numRead; ) + { + struct inotify_event* event = (struct inotify_event *) p; + logVar("There is change with %s\n", event->name); + + char file[PATH_MAX] = {}; + sprintf(file, "%s/%s", work_dir, event->name); + + if (is_text_file(file)) + { + logVar("%s is text", event->name); + create_diff(file, event->name); + f_textChanged = 1; + } + + p += sizeof(struct inotify_event) + event->len; + } + + if (f_textChanged) + { + create_sample(); + } + + return f_textChanged; +} + + + +void create_diff (const char* observed_file_path, const char* file_name) +{ + char backup_file[PATH_MAX] = {}; + sprintf(backup_file, "%s/%s", DAEMON_DIR, file_name); + + char cmd[CMD_SIZE] = {}; + sprintf(cmd, "diff -Nbur %s %s > %s/%s.diff", + backup_file, observed_file_path, DIFF_DIR, file_name); + + system(cmd); +} + +int is_text_file(const char* file) +{ + char cmd[CMD_SIZE] = {}; + sprintf(cmd, "file %s | grep \":*text\" > /dev/null", file); + + int sys_ret = 0; + sys_ret = system(cmd); + + return sys_ret == 0 ? 1 : 0; +} + +void create_sample() +{ + char timestamp[STAMP_SIZE] = {}; + getTimestamp(timestamp); + + char cmd[CMD_SIZE] = {}; + + sprintf(cmd, "cat %s/*.diff > %s/%s.sample", DIFF_DIR, SAMPLE_DATA_DIR, timestamp); + logVar("SAMPLE execut: %s", cmd); + system(cmd); + + sprintf(cmd, "rm %s/*.diff", DIFF_DIR); + system(cmd); +} + +void getTimestamp(char* timestamp) +{ + time_t rawtime; + struct tm * timeinfo; + + time(&rawtime); + timeinfo = localtime(&rawtime); + sprintf (timestamp,"%s", asctime(timeinfo)); + + for (; *timestamp; timestamp++) + if (*timestamp == ' ' || *timestamp == '\n') *timestamp = '_'; + + return 0; +} \ No newline at end of file diff --git a/task6/homework/saveSamples.sh b/task6/homework/saveSamples.sh new file mode 100644 index 0000000..f3a0043 --- /dev/null +++ b/task6/homework/saveSamples.sh @@ -0,0 +1,16 @@ +#! /bin/bash + +while getopts ":k:r" options; +do + case "$options" in + r) patch_reverse=-R + echo "$OPTARG" + ;; + k) sample_deep=${OPTARG};; + esac +done + +for sample_name in `ls ./SampleData | sort -r -d | head -$sample_deep` +do + patch -s -N $patch_reverse -d ./DaemonData < ./SampleData/$sample_name > /dev/null +done \ No newline at end of file From 9198936180701ae7a1e8d191f5ac725afba2482b Mon Sep 17 00:00:00 2001 From: VMWareDaniil Date: Mon, 5 Dec 2022 08:52:05 -0800 Subject: [PATCH 40/40] task6 completed --- task6/homework/daemon.h | 1 + task6/homework/interface.c | 35 ++++++++++++++++++++ task6/homework/log.c | 2 +- task6/homework/log.h | 8 +++++ task6/homework/log.txt | 65 -------------------------------------- task6/homework/main.c | 24 +++++++------- task6/homework/makefile | 6 ++-- task6/homework/polling.c | 10 +++--- 8 files changed, 65 insertions(+), 86 deletions(-) delete mode 100644 task6/homework/log.txt diff --git a/task6/homework/daemon.h b/task6/homework/daemon.h index a843c8e..1bd53ab 100644 --- a/task6/homework/daemon.h +++ b/task6/homework/daemon.h @@ -23,6 +23,7 @@ int saveDirData(const char* curDir); int cp(const char *to, const char *from); int createDir(const char* dir_name); +void createDaemon(); void registerSignals(); FILE* prepareInterface(); diff --git a/task6/homework/interface.c b/task6/homework/interface.c index 3851c9c..83aa97d 100644 --- a/task6/homework/interface.c +++ b/task6/homework/interface.c @@ -1,5 +1,40 @@ #include "daemon.h" +void createDaemon() +{ + pid_t pid; + /* Fork off the parent process */ + pid = fork(); + + /* An error occurred */ + if (pid < 0) + exit(EXIT_FAILURE); + + /* Success: Let the parent terminate */ + if (pid > 0) + { + exit(EXIT_SUCCESS); + } + + /* On success: The child process becomes session leader */ + if (setsid() < 0) + exit(EXIT_FAILURE); + + /* Fork off for the second time*/ + pid = fork(); + + /* An error occurred */ + if (pid < 0) + exit(EXIT_FAILURE); + + /* Success: Let the parent terminate */ + if (pid > 0) + { + exit(EXIT_SUCCESS); + } +} + + void signalHnd() { fprintf(stdout, "Can't sent signal to proccess pid:%d\n", getpid()); diff --git a/task6/homework/log.c b/task6/homework/log.c index 97ff590..4f86d70 100644 --- a/task6/homework/log.c +++ b/task6/homework/log.c @@ -15,7 +15,7 @@ void startLogging() void showExample() { - fprintf(stdout, "Program example:\n" + fprintf(stderr, "Program example:\n" "MODS: -b [BASH MOD], -d [DAEMON MOD]\n" "\'name.out -b 5\'\n" "BASH MOD WITH PID = 5\n" diff --git a/task6/homework/log.h b/task6/homework/log.h index 0bb71be..5d21111 100644 --- a/task6/homework/log.h +++ b/task6/homework/log.h @@ -7,12 +7,18 @@ FILE* log; +#ifndef NDEBUG + #define $ fprintf(stderr, "LINE %d\n", __LINE__); +#endif + #define LOG_FUNC(function_name) fprintf(log, "CALLING FUNC: \'%s\' ON %d LINE\n", #function_name, __LINE__); \ fprintf(stderr, "ERROR: check log.txt\n"); + + #define LOG(msg) fprintf(log, "\nLOGGER_MSG\n" \ "MSG: %s\n" \ "FUNC:%s\n" , msg, __FUNCTION__); \ @@ -30,4 +36,6 @@ void logVar(const char* format, ...); #define EXIT_ERROR -1337 + + #endif \ No newline at end of file diff --git a/task6/homework/log.txt b/task6/homework/log.txt deleted file mode 100644 index b22c4e9..0000000 --- a/task6/homework/log.txt +++ /dev/null @@ -1,65 +0,0 @@ - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main -Set period:from 3 to 4 - - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main - -LOGGER_MSG -MSG: NO CMD - -FUNC:main - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main - -LOGGER_MSG -MSG: NO CMD - -FUNC:main - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main - -LOGGER_MSG -MSG: NO CMD - -FUNC:main - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main -Count of last logs: 1 - - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main - -LOGGER_MSG -MSG: NO CMD - -FUNC:main - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main - -LOGGER_MSG -MSG: NO CMD - -FUNC:main - -LOGGER_MSG -MSG: START SAMPLING -FUNC:main - -LOGGER_MSG -MSG: KILL DAEMON -FUNC:main diff --git a/task6/homework/main.c b/task6/homework/main.c index f22a9e8..8fd7fa8 100644 --- a/task6/homework/main.c +++ b/task6/homework/main.c @@ -4,16 +4,18 @@ int main(int argc, char* argv[]) { + system("make clean"); startLogging(); pid_t pid = 0; FILE* cmdFile = prepareInterface(); int mod = getCMDargs(argc, argv, &pid); - fprintf(stdout, "Daemon pid: %d\n", getpid()); + fprintf(stdout, "DaemonLog pid: %d\n", getpid()); if (mod == DAEMON) { + createDaemon(); } char workDir[PATH_MAX_SIZE] = {}; @@ -51,29 +53,27 @@ int main(int argc, char* argv[]) switch (cmd) { case KILL_DAEMON: - LOG("KILL DAEMON"); - DAEMON_HP = 0; + LOG("KILL DAEMON"); + DAEMON_HP = 0; break; case PERIOD: - logVar("Set period:from %d to %d\n", T, arg); - T = arg; + logVar("Set period:from %d to %d\n", T, arg); + T = arg; break; case PRINTLOGS: - logVar("Count of last logs: %d\n", arg); - sprintf(cmd_buffer, "bash bashDiff.sh %d %s", arg, DAEMON_CMD); - system(cmd_buffer); + logVar("Count of last logs: %d\n", arg); + sprintf(cmd_buffer, "bash bashDiff.sh %d %s", arg, DAEMON_CMD); + system(cmd_buffer); break; case ERROR: - fprintf(stderr, "ERROR CHECK LOGS\n"); - LOG("ERROR"); + LOG("ERROR"); break; case NO_CMD: - fprintf(stderr,"NO CMD\n"); - LOG("NO CMD\n"); + LOG("NO CMD\n"); break; } diff --git a/task6/homework/makefile b/task6/homework/makefile index 706d3a6..b8d43c9 100644 --- a/task6/homework/makefile +++ b/task6/homework/makefile @@ -2,9 +2,11 @@ all: gcc main.c log.c parser.c interface.c polling.c -o daemon.out -ggdb3 -O0 -w -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat=2 -Winline -Wlogical-op -Wopenmp-simd -Wpacked -Wpointer-arith -Winit-self -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow=2 -Wsuggest-attribute=noreturn -Wsuggest-final-methods -Wsuggest-final-types -Wswitch-default -Wswitch-enum -Wsync-nand -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wno-missing-field-initializers -Wno-narrowing -Wno-varargs -Wstack-protector -fcheck-new -fstack-protector -fstrict-overflow -flto-odr-type-merging -fno-omit-frame-pointer -pie -fPIE -fsanitize=address,alignment,bool,bounds,enum,float-cast-overflow,float-divide-by-zero,integer-divide-by-zero,leak,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,undefined,unreachable,vla-bound,vptr gg: - gcc main.c log.c parser.c interface.c polling.c -o daemon.out + gcc main.c log.c parser.c interface.c polling.c -o daemon.out -DNDEBUG clean: rm -rf DaemonData rm -rf tmp - rm -rf DaemonDiff \ No newline at end of file + rm -rf DaemonDiff + rm -rf SampleData + rm DaemonCmd.txt \ No newline at end of file diff --git a/task6/homework/polling.c b/task6/homework/polling.c index c0a0485..8205fd6 100644 --- a/task6/homework/polling.c +++ b/task6/homework/polling.c @@ -92,12 +92,10 @@ void create_sample() void getTimestamp(char* timestamp) { - time_t rawtime; - struct tm * timeinfo; - - time(&rawtime); - timeinfo = localtime(&rawtime); - sprintf (timestamp,"%s", asctime(timeinfo)); + static int timetmp = 0; + + sprintf (timestamp,"%d", timetmp); + timetmp++; for (; *timestamp; timestamp++) if (*timestamp == ' ' || *timestamp == '\n') *timestamp = '_';