Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/wait.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <signal.h>
- #include <ctype.h>
- void reverse(char*);
- void changeCase(char*);
- void koi8er(char*);
- void swap(char*);
- void catchSignal(int);
- void commandToLowerCase(char*);
- int flag;
- void reverse(char *str) {
- char* end = str;
- char buf;
- while (*end != '\0') end++;
- end--;
- str+=2;
- while (end > str) {
- buf = *str;
- *str = *end;
- *end = buf;
- str++;
- end--;
- }
- }
- void swap(char *str) {
- char buf;
- char *ptr;
- for (int i = 0; i < 2; i++) {
- if (*str != '\0') {
- str++;
- }
- }
- while(*str != '\0') {
- buf = *str;
- ptr = str;
- if (*(++ptr) == '\0') break;
- *str = *ptr;
- *ptr = buf;
- str+=2;
- }
- }
- void koi8er(char* str) {
- int len;
- int dig = 0;
- int i = 0;
- char c;
- len = (int)strlen(str);
- while ((c = str[i]) != '\0') {
- if (c <= (int)'Z' && c >= (int)'A') {
- str[i] = c + 32;
- i++;
- continue;
- } else if (c <= (int)'z' && c >= (int)'a') {
- str[i] = c - 32;
- i++;
- continue;
- } else {
- str[i] = c;
- i++;
- continue;
- }
- }
- for (dig = 0; dig < len; dig++) {
- str[dig] += 128;
- }
- }
- void changeCase(char *strcase) {
- int len, ch=0, i=0;
- char c;
- char sw = strcase[1];
- len = (int)strlen(strcase);
- switch (sw) {
- case '1':
- for (ch = 0; ch < len; ch++) {
- strcase[ch] = toupper(strcase[ch]);
- }
- break;
- case '2':
- for (ch = 0; ch < len; ch++) {
- strcase[ch] = tolower(strcase[ch]);
- }
- break;
- case '3':
- while((c = strcase[i]) != '\0') {
- if(c <= (int)'Z' && c >= (int)'A') {
- strcase[i] = c + 32;
- i++;
- continue;
- } else if(c <= (int)'z' && c >= (int)'a') {
- strcase[i] = c - 32;
- i++;
- continue;
- } else {
- strcase[i] = c;
- i++;
- continue;
- }
- }
- }
- }
- void commandToLowerCase(char *str) {
- char *ptr = str;
- char letter;
- char sleshSymbol = '/';
- char *slesh = strchr(str, (int)sleshSymbol);
- if (slesh == NULL) {
- *ptr = '/';
- ptr++;
- }
- while(*ptr != '\0') {
- letter = tolower(*ptr);
- *str = letter;
- ptr++;
- }
- printf("%s\n", str);
- }
- // Функция перехвата сигнала прерывания для ввода команд.
- void catchSignal(int sig) {
- signal(SIGINT, catchSignal);
- char userCommand[10];
- char inputString[] = "\nВведите строку\n";
- printf("\n\t----------------------------------------------\n");
- printf("\n\tВыберете тип преобразования сроки процессами\n\n");
- printf("%s%s%s%s%s",
- "\tСписок команд для первого процесса :\n\t",
- "/def1 - трансляция строки в неизменном виде;\n\t",
- "/invert - инвертирование строки - первый символ становится последним и т.д.;\n\t",
- "/swap - обмен соседних символов - нечетный становится на место четного и наоборот;\n\t",
- "/koi8 - перевод в кодировку КОИ-8.\n"
- );
- printf("%s%s%s%s%s",
- "\n\tСписок команд для второго процесса :\n\t",
- "/def2 - трансляция строки в неизменном виде;\n\t",
- "/upreg - перевод всех символов строки в \"верхний регистр\";\n\t",
- "/lowreg - перевод всех символов строки в \"нижний регистр\";\n\t",
- "/swreg - смена \"регистра\" всех символов строки;\n"
- );
- printf("\n\t**************************************\n");
- printf("\n\t/out - завершение программы\n");
- printf("\n\t**************************************\n");
- printf("Введите команду:\n");
- scanf("%s", userCommand);
- if (strcmp(userCommand, "/invert") == 0) {
- flag = flag % 10 + 10;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/swap") == 0) {
- flag = flag % 10 + 20;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/koi8") == 0) {
- flag = flag % 10 + 30;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/def2") == 0) {
- flag = (flag / 10) * 10;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/upreg") == 0) {
- flag = (flag / 10) * 10 + 1;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/lowreg") == 0) {
- flag = (flag / 10) * 10 + 2;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/swreg") == 0) {
- flag = (flag / 10) * 10 + 3;
- printf("%s", inputString);
- }
- if (strcmp(userCommand, "/out") == 0) {
- flag = 44;
- printf("\tВыход из программы\n");
- }
- }
- int main(int argc, char * argv[]) {
- // дискрипторы для канала между процессами 0 и 1
- int pipe01[2];
- // дискрипторы для канала между процессами 1 и 2
- int pipe12[2];
- // pid для двух сыновей-процессов
- pid_t pid0 = getpid(), cpid1, cpid2, ppid;
- // для кореневого процесса
- char buf[50];
- // для процесса 1
- char inputer[50];
- // для процесса 2
- char final[50];
- int i = 0;
- // создание канала между процессами 0 и 1
- if (pipe(pipe01) < 0) {
- perror("Ошибка создания канала между процессами 0 и 1!\n");
- exit(-1);
- }
- // создание первой копии процесса отца
- cpid1 = fork();
- if (cpid1 < 0) {
- perror("Ошибка создания процесса 1!\n");
- exit(-2);
- } else if (cpid1 == 0) {
- // процесс сын
- if (pipe(pipe12) < 0) {
- perror("Ошибка создания канала между процессами 1 и 2!\n");
- exit(-3);
- }
- cpid2 = fork();
- if (cpid2 < 0) {
- perror("Ошибка создания процесса 2!\n");
- exit(-4);
- }
- }
- if ((getpid() != pid0) && cpid2 != 0) {
- // код для процесса 1
- // закрыть дискриптор для записи в канал 0 -> 1
- close(pipe01[1]);
- // закрыть дискриптор для чтения из канал 1 -> 2
- close(pipe12[0]);
- // игнорировать сигнал прерывания процесса
- signal(SIGINT, SIG_IGN);
- while (1) {
- i = 0;
- kill(getpid(), SIGSTOP);
- // читать из канало 01
- while (read(pipe01[0], &buf[i], 1) && buf[i] != EOF) {
- i++;
- }
- buf[i] = '\0';
- switch (buf[0]) {
- case '1':
- reverse(buf);
- break;
- case '2':
- swap(buf);
- break;
- case '3':
- koi8er(buf);
- break;
- default:
- break;
- }
- int m = 2;
- write(1, "\tПроцесс 1 : ", 20);
- // вывод в терминал результат работы процесса 1
- while (m < strlen(buf)) {
- write(1, &buf[m], 1);
- m++;
- }
- printf("\n");
- buf[i] = EOF;
- // писать в канал 1 -> 2
- write(pipe12[1], buf, i + 1);
- // пробудить процесс 2
- kill(cpid2, SIGCONT);
- }
- _exit(EXIT_SUCCESS);
- } else if ((getpid() != pid0) && (cpid2 == 0)) {
- // код для процесса 2
- // закрыть дискриптор для чтения из канала 0 -> 1
- close(pipe01[0]);
- // закрыть дискриптор для записи в канал 0 -> 1
- close(pipe01[1]);
- // закрыть дискриптор для записи в канал 1 -> 2
- close(pipe12[1]);
- signal(SIGINT, SIG_IGN);
- while (1) {
- i = 0;
- kill(getpid(), SIGSTOP);
- while (read(pipe12[0], &final[i], 1) && final[i] != EOF) {
- i++;
- }
- final[i] = '\0';
- changeCase(final);
- i = 2;
- write(1, "\tПроцесс 2 : ", 20);
- while (i < strlen(final)) {
- write(1, & final[i], 1);
- i++;
- }
- printf("\n");
- }
- } else {
- // код для корневого процесса
- // закрыть дискриптор для чтения из канала 0 -> 1
- close(pipe01[0]);
- // обработать сигнал прерывания процесса
- signal(SIGINT, catchSignal);
- printf("Введите строку. Для смены типа обработки нажмите Ctrl + C:\n");
- inputer[0] = inputer[1] = '0';
- // читать строку из стандартного потока ввода
- while (1) {
- i = 2;
- do {
- read(0, &inputer[i], 1);
- i++;
- } while (inputer[i - 1] != '\n');
- char transl;
- int m = 0;
- for (m = 0; m < 2; m++) {
- if (!m) {
- transl = flag / 10;
- } else {
- transl = flag % 10;
- }
- switch (transl) {
- case 0:
- inputer[m] = '0';
- break;
- case 1:
- inputer[m] = '1';
- break;
- case 2:
- inputer[m] = '2';
- break;
- case 3:
- inputer[m] = '3';
- break;
- default:
- printf(".");
- break;
- }
- }
- if (flag == 44) {
- // если команда out - удалить два процесса-сына 1 и 2
- kill(cpid1, SIGTERM);
- kill(cpid2, SIGTERM);
- exit(0);
- }
- inputer[i - 1] = '\0';
- m = 2;
- write(1, "\tПроцесс 0 : ", 20);
- // писать в поток стандартного вывода строку, введенную через поток стандартного ввода
- while (m < strlen(inputer)) {
- write(1, &inputer[m], 1);
- m++;
- }
- printf("\n");
- inputer[i - 1] = EOF;
- // передать строку в канал 0 -> 1 (запись)
- write(pipe01[1], inputer, i);
- // пробудить процесс 1
- kill(cpid1, SIGCONT);
- }
- wait(NULL);
- exit(EXIT_SUCCESS);
- }
- }
Add Comment
Please, Sign In to add comment